hadoop conferencejapan2011

Post on 28-Jun-2015

10.749 Views

Category:

Technology

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Hiveを用いた Amebaサービスのログ解析共通基盤

-Hadoop

Conference

Japan

2011-

株式会社サイバーエージェント

アメーバ事業本部

プラットフォームディヴィジョン

コアテクノロジーグループ

福田

一郎

2株式会社サイバーエージェント

自己紹介

名前

福田一郎

(フクダ

イチロー)

所属

株式会社サイバーエージェント アメーバ事業本部

プラットフォームディヴィジョン

コアテクノロジーグループ

(新卒入社3年目)

(過去)

• Ameba Pigg運用,開発

(現在)

• ログ解析基盤

「Patriot」設計,開発,運用

【Twitter】

@toutou

【はてなID】

id:ICHIRO

3株式会社サイバーエージェント

アジェンダ

• アメーバについて• ログ解析基盤Patriot• Hive• Patriotの構成と運用

アメーバについて

5株式会社サイバーエージェント

サービス規模に関する数値

【Ameba全体】 [会員数]

1300万人

(2011/1/5時点)

[PV数]

(2010年12月時点) 合計:194.9億PV

(2011年1月で200億PV突破)

PC :

99.9億PV MB :

95.0億PV

(スマートフォンUU :

367万UU) 【アメーバPigg】

[会員数]

600万人

(2011/1/14時点) [ARPPU]

¥2,121 (2010年12月時点)

6株式会社サイバーエージェント

Amebaサービス

ブログ

なう

Pigg

7株式会社サイバーエージェント

アメーバピグ

Pigg

for Android

8株式会社サイバーエージェント

モバイルゲーム

Ameba と Hadoop

10株式会社サイバーエージェント

Hadoop使用実績

アメーバピグ (HDFS)

アクセス解析(0.13.1)

pico (Amazon EMR,

Pig)

ログ解析基盤 Patriot

12株式会社サイバーエージェント

Patriot開発までの経緯[2009年]

11月13日

Hadoop

Conference Japan 2009 ー CDH,Hiveなどを知る

11月21日~23日

開発合宿@伊豆高原

統合ログ解析基盤が必要という結論に至る

11月27日

局長に相談

即GOサイン

[2010年] 3月末

本格検証開始

7月

第1弾リリース,11月

WebUIを中心にリニューアル

13株式会社サイバーエージェント

標準的なサービス開発体制

プロデューサ

インフラエンジニアアプリエンジニア

課金系担当

会員獲得系担当

数値を 知りたい

14株式会社サイバーエージェント

今までの問題点• 各サービスごとに独自に解析

– プロフィールデータとの結合など定型的なものも

• ログ容量の肥大化

– 消されていくログ

• サービス開発担当者が解析部分にまで手が回らない

– モバイルゲームなど開発スピードが速い

– サービスリリースしてスグに情報が欲しい

15株式会社サイバーエージェント

目的

Amebaサービス全体の

統合的な現状把握と未来予測

各サービスのデータを集約

サービス開発支援

16株式会社サイバーエージェント

方法• ログの集約

– HDFS

• ログの集計

– Map/Reduce

• ログの構造化

– Hive

• 集計結果の表示

– Patriot WebUI

(CIC)

• アドホックな集計,解析

– HUE

Hive

18株式会社サイバーエージェント

Hiveとは

• Hadoopのサブプロジェクト• Facebookで開発されていた

• SQLライクな言語でMap/Redを記述• 同様の試みにPig(スクリプト言語)

19株式会社サイバーエージェント

Hiveの特徴

• HiveQL

– SQLのような言語でMapReduceを実行

• メタストア

– テーブルのカラム情報などを保持

– デフォルトはDerby

– PatriotではMySQLを使用

• 行単位での更新ができない

– Partitionを使う

20株式会社サイバーエージェント

データストア

login

テーブル Partition

date=2011-02-23

dev=pc

dev=mb

date=2011-02-22

Bucket

21株式会社サイバーエージェント

データモデル

• Primitive• int,float,double,String

• Complex• map<key-type,value-type>• list<element-type>• struct<field-name:field-type>

22株式会社サイバーエージェント

DDL

CREATE TABLE pigg_login ( time STRING, ameba_id

STRING, ip

STRING)

partitioned by(dt

STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY '¥t'

STORED AS SEQUENCEFILE;

カラムの区切り文字を指定

Partitionカラムを指定

ファイル形式を指定• TextFile• SequenceFile• (RCFile)

23株式会社サイバーエージェント

データのロード

LOAD DATA (LOCAL) INPATH '/tmp/pigg_login.log' INTO TABLE

pigg_login

PARTITION(dt='2011-02-22');

• dfs

mv, putをする形

INSERT OVERWRITE TABLE t1 SELECT c1 FROM t2;

24株式会社サイバーエージェント

HiveQL(1)

• JOIN,LEFT OUTER JOIN• GROUP BY• UNION

ALL

など

SELECT * FROM t1 JOIN t2 ON(t1.a2 = t2.b2);

25株式会社サイバーエージェント

HiveQL(2)

• UDF• cast, abs, substr

• UDAF• count, sum, max, min, avg• パーセント点

percentile(col, p)(参考)

http://wiki.apache.org/hadoop/Hive/LanguageManual/UDF

26株式会社サイバーエージェント

SerDe(1)

• Serialization/Deserialization• カラムの区切り文字などを定義CREATE TABLE test(c1 string, c2 int)

ROW FORMAT DELIMITEDFIELDS TERMINATED BY '¥t'LINES TERMINATED BY '¥n';

ichiro[tab]16suzuki[tab]51

c1

ichiro

suzuki

c2

16

51

27株式会社サイバーエージェント

SerDe(2)【Apacheログ】add jar 'hive_contrib.jar'

CREATE TABLE apachelog

(host STRING, identity STRING, user STRING,

time STRING, method STRING, resource STRING,

proto STRING, status STRING, size STRING, referer

STRING,

agent STRING, proctime

STRING)

ROW FORMAT SERDE

'org.apache.hadoop.hive.contrib.serde2.RegexSerDe'

WITH SERDEPROPERTIES

("input.regex" = "^(.*?) (.*?) (.*?) ¥¥[(.*?)¥¥]

¥"(¥¥S+?)(?: +(.*?) +(¥¥S*?))?¥" (.*?) (.*?)

¥"(.*?)¥" ¥"(.*?)¥" (.*?)$",

"output.format.string" = "%1$s %2$s %3$s %4$s %5$s %6$s %7$s

%8$s %9$s %10$s %11$s %12$s");

Patriotの構成と運用

29株式会社サイバーエージェント

開発体制

システム

3名 インフラ

都度対応

課金系担当会員獲得系担当

30株式会社サイバーエージェント

解析フロー

ログ転送

UtilHadoop

クラスタ

ログ整形Hiveインポート

Hive Job各サービス

サマリDB(MySQL)

サマリデータ

View

31株式会社サイバーエージェント

システム構成(サーバ1)

【NN,JT,SNN】 2CoreCPU,16GB RAM

各1台

(Dell R300)

【DN,TT】 4CoreCPU,16GB RAM

1TB HDD×4

(RAIDなし), 全18台

(Dell R410)

32株式会社サイバーエージェント

システム構成(サーバ2)

【Utilサーバ】 4CoreCPU,16GB RAM

1TB HDD×4

(RAID1) 全2台

サマリDB,Web/APサーバ (Dell R410)

33株式会社サイバーエージェント

システム構成(アプリ)

【Webアプリ】 Ext JS3.2.1 HUE1.0.1

【Hadoop関連】 CDH3 (Hadoop0.20,Hive0.5)

Puppet,Nagios,Ganglia

【ジョブ管理】 Hinemos

3.2

34株式会社サイバーエージェント

システム構成(misc)

Hadoop クラスタ

踏み台サーバ

NameNodeはNFSでバックアップ

35株式会社サイバーエージェント

ファイルフォーマットの検討

圧縮形式

gzip,bzip2,LZO

フォーマット

TextFile,SeqenceFile

圧縮率

bzip2>gzip>LZO

インポート時間

LZO>無圧縮>gzip>bzip2

計算時間

無圧縮>LZO>gzip>bzip2

Patriotではgzip,SeqenceFile,ブロック単位の圧縮を使用中

MapOutputはLZOで圧縮

36株式会社サイバーエージェント

インポート処理

ログ転送

UtilHadoop

クラスタ

各サービス

SCP HDFS get

• 正規表現でマッチするレコードを抽出• gzip,SeqenceFileでHDFS上に出力• Hiveにロード

37株式会社サイバーエージェント

インポート処理

DSL(1)

import {service "gyaos"backup_dir

"/data/log/gyaos"

data {type "scp"

← その他に「mysql」,「hdfs」

servers ["172.xxx.yyy.zzz", " 172.xxx.yyy.zzz "]user "cy_httpd"path "/home/cy_httpd/logs/tomcat/lifelog/*.#{$dt}*"limit 10000

}(つづく)

38株式会社サイバーエージェント

インポート処理

DSL(2)load {

type "hive" ← 「mysql」table {

name "game_login"regexp

"^[^¥¥t]*¥¥t([^¥¥t]*)¥¥tlogin"

output "$1"partition :dt

=> "#{$dt}", :service => "gyaos"

}table {

name "game_user"regexp

"^([^¥¥t]*)¥¥t([^¥¥t]*)¥¥tregist_game"

output "$2¥t$1"partition :dt

=> "#{$dt}", :service => "gyaos"

}}}

39株式会社サイバーエージェント

集計処理

Util

Hadoop クラスタ

サマリDB(MySQL)

サマリデータHive Job

40株式会社サイバーエージェント

集計・解析処理

DSLmysql

{

host "localhost"port 3306username "patriot-batch"password "xxxdatabase "gyaos"

}analyze {

name "gyaos_new_user_num_daily"primary "dt"hive_ql

"select count(1), '#{$dt}' from game_user

where dt='#{$dt}' and

service='gyaos'"}analyze {

name "gyaos_unregist_user_num_daily"primary "dt"hive_ql

"select count(1), '#{$dt}' from game_user

g join ameba_member

a on

(g.ameba_id

= a.ameba_id) where a.unregist_date

<> '' and

to_date(a.unregist_date)='#{$dt}' and g.service='gyaos'"}・・・

41株式会社サイバーエージェント

ゲーム関連の集計• モバイルゲーム– ゲームごとにパーティションを作る

• Pigg内ゲーム– 釣り,カジノゲーム– UNION ALLで合わせて集計

テーブル

game_login

Partition

日付

ゲームID

42株式会社サイバーエージェント

UDFの作り方

【年齢によるグルーピング】public class ConvertAge extends UDF {

public Integer evaluate(String birth, String ym) {if (birth == null || ym == null) {

return -1;}int ageRange = -1;// 年齢の範囲に従ってageRangeに値を設定(略)return ageRange;

}}

43株式会社サイバーエージェント

運用上の数字

• HiveQLクエリ• デイリー(定型)・・・約600• マンスリー(定型)・・・約700

• 会員データレコード数・・・1300万以上• ログ容量(デイリー)

• Pigg・・・4.5GB(圧縮後)• タレントブログ関連(ログインユーザのみ)

・・・5.5GB(圧縮後)• 処理時間(全集計)・・・3~4時間

Webインタフェース (CIC)

45株式会社サイバーエージェント

デイリー,マンスリーサマリ

46株式会社サイバーエージェント

属性レポート

性別・年齢など属性ごとの割合

47株式会社サイバーエージェント

タレントブログ解析(大和)

あるタレントのブログを見ている人の属性

HUE

49株式会社サイバーエージェント

Beeswax

HiveQLをWEB UIから 直接叩ける

アドホックな集計

ヒープサイズに注意

50株式会社サイバーエージェント

HUEの運用

• Hiveメタストア(マスター)• HDFSへの書き込み権限のある

HUEのユーザ• 管理者用

MySQLレプリ

• Hiveメタストア(スレーブ)• HDFSへの書き込み権限無し• プロデューサ用

51株式会社サイバーエージェント

啓蒙活動• 集計サマリをいつでも確認できる

• Webアプリ上でHiveQLが叩ける

• プロデューサなどエンジニアでない人もHiveQLを書く

– 毎日、多くのアドホックな集計が走っている

– 失敗から学ぶ

【失敗例】

select count(distinct

m. ameba_id) from pigg_enter

m join pigg_enter

p on m.ameba_id

= p.ameba_id

where m.dt

like

'2010-10-__' and p.dt

like '2010-11-__'

→ サブクエリを学ぶ

52株式会社サイバーエージェント

今後の展開• HBase

・・・

CDH3b4

• ログ収集の改善

– Flumeなど

• レコメンドなど実験的にやっているものを本格化

• 「なう」などグラフ構造を使った解析

53株式会社サイバーエージェント

Ameba Technology Laboratory• 秋葉原ダイビルに開設

• 2011年4月1日~

• 研究開発、実験的サービス、産学連携

• 勉強会スペース (20~30人)

ありがとうございました

top related