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