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 DELIMITED
FIELDS TERMINATED BY '¥t'
LINES TERMINATED BY '¥n';
ichiro[tab]16
suzuki[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
株式会社サイバーエージェント
解析フロー
ログ転送
Util
Hadoop
クラスタ
ログ整形
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
株式会社サイバーエージェント
インポート処理
ログ転送
Util
Hadoop
クラスタ
各サービス
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
株式会社サイバーエージェント
集計・解析処理 DSL
mysql {
host "localhost"
port 3306
username "patriot-batch"
password "xxx
database "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人)
ありがとうございました

Hadoop conferencejapan2011