54
Hiveを用いた Amebaサービスのログ解析共通基盤 -Hadoop Conference Japan 2011- 株式会社サイバーエージェント アメーバ事業本部 プラットフォームディヴィジョン コアテクノロジーグループ 福田 一郎

Hadoop conferencejapan2011

Embed Size (px)

Citation preview

Page 1: Hadoop conferencejapan2011

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

-Hadoop

Conference

Japan

2011-

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

アメーバ事業本部

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

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

福田

一郎

Page 2: Hadoop conferencejapan2011

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

自己紹介

名前

福田一郎

(フクダ

イチロー)

所属

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

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

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

(新卒入社3年目)

(過去)

• Ameba Pigg運用,開発

(現在)

• ログ解析基盤

「Patriot」設計,開発,運用

【Twitter】

@toutou

【はてなID】

id:ICHIRO

Page 3: Hadoop conferencejapan2011

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

アジェンダ

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

Page 4: Hadoop conferencejapan2011

アメーバについて

Page 5: Hadoop conferencejapan2011

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月時点)

Page 6: Hadoop conferencejapan2011

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

Amebaサービス

ブログ

なう

Pigg

Page 7: Hadoop conferencejapan2011

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

アメーバピグ

Pigg

for Android

Page 8: Hadoop conferencejapan2011

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

モバイルゲーム

Page 9: Hadoop conferencejapan2011

Ameba と Hadoop

Page 10: Hadoop conferencejapan2011

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

Hadoop使用実績

アメーバピグ (HDFS)

アクセス解析(0.13.1)

pico (Amazon EMR,

Pig)

Page 11: Hadoop conferencejapan2011

ログ解析基盤 Patriot

Page 12: Hadoop conferencejapan2011

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

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

11月13日

Hadoop

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

11月21日~23日

開発合宿@伊豆高原

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

11月27日

局長に相談

即GOサイン

[2010年] 3月末

本格検証開始

7月

第1弾リリース,11月

WebUIを中心にリニューアル

Page 13: Hadoop conferencejapan2011

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

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

プロデューサ

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

課金系担当

会員獲得系担当

数値を 知りたい

Page 14: Hadoop conferencejapan2011

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

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

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

• ログ容量の肥大化

– 消されていくログ

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

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

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

Page 15: Hadoop conferencejapan2011

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

目的

Amebaサービス全体の

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

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

サービス開発支援

Page 16: Hadoop conferencejapan2011

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

方法• ログの集約

– HDFS

• ログの集計

– Map/Reduce

• ログの構造化

– Hive

• 集計結果の表示

– Patriot WebUI

(CIC)

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

– HUE

Page 17: Hadoop conferencejapan2011

Hive

Page 18: Hadoop conferencejapan2011

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

Hiveとは

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

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

Page 19: Hadoop conferencejapan2011

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

Hiveの特徴

• HiveQL

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

• メタストア

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

– デフォルトはDerby

– PatriotではMySQLを使用

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

– Partitionを使う

Page 20: Hadoop conferencejapan2011

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

データストア

login

テーブル Partition

date=2011-02-23

dev=pc

dev=mb

date=2011-02-22

Bucket

Page 21: Hadoop conferencejapan2011

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

データモデル

• Primitive• int,float,double,String

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

Page 22: Hadoop conferencejapan2011

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)

Page 23: Hadoop conferencejapan2011

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;

Page 24: Hadoop conferencejapan2011

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

HiveQL(1)

• JOIN,LEFT OUTER JOIN• GROUP BY• UNION

ALL

など

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

Page 25: Hadoop conferencejapan2011

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

HiveQL(2)

• UDF• cast, abs, substr

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

percentile(col, p)(参考)

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

Page 26: Hadoop conferencejapan2011

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

Page 27: Hadoop conferencejapan2011

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");

Page 28: Hadoop conferencejapan2011

Patriotの構成と運用

Page 29: Hadoop conferencejapan2011

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

開発体制

システム

3名 インフラ

都度対応

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

Page 30: Hadoop conferencejapan2011

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

解析フロー

ログ転送

UtilHadoop

クラスタ

ログ整形Hiveインポート

Hive Job各サービス

サマリDB(MySQL)

サマリデータ

View

Page 31: Hadoop conferencejapan2011

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

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

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

各1台

(Dell R300)

【DN,TT】 4CoreCPU,16GB RAM

1TB HDD×4

(RAIDなし), 全18台

(Dell R410)

Page 32: Hadoop conferencejapan2011

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

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

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

1TB HDD×4

(RAID1) 全2台

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

Page 33: Hadoop conferencejapan2011

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

システム構成(アプリ)

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

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

Puppet,Nagios,Ganglia

【ジョブ管理】 Hinemos

3.2

Page 34: Hadoop conferencejapan2011

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

システム構成(misc)

Hadoop クラスタ

踏み台サーバ

NameNodeはNFSでバックアップ

Page 35: Hadoop conferencejapan2011

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

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

圧縮形式

gzip,bzip2,LZO

フォーマット

TextFile,SeqenceFile

圧縮率

bzip2>gzip>LZO

インポート時間

LZO>無圧縮>gzip>bzip2

計算時間

無圧縮>LZO>gzip>bzip2

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

MapOutputはLZOで圧縮

Page 36: Hadoop conferencejapan2011

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

インポート処理

ログ転送

UtilHadoop

クラスタ

各サービス

SCP HDFS get

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

Page 37: Hadoop conferencejapan2011

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

}(つづく)

Page 38: Hadoop conferencejapan2011

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"

}}}

Page 39: Hadoop conferencejapan2011

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

集計処理

Util

Hadoop クラスタ

サマリDB(MySQL)

サマリデータHive Job

Page 40: Hadoop conferencejapan2011

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'"}・・・

Page 41: Hadoop conferencejapan2011

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

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

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

テーブル

game_login

Partition

日付

ゲームID

Page 42: Hadoop conferencejapan2011

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;

}}

Page 43: Hadoop conferencejapan2011

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

運用上の数字

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

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

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

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

Page 44: Hadoop conferencejapan2011

Webインタフェース (CIC)

Page 45: Hadoop conferencejapan2011

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

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

Page 46: Hadoop conferencejapan2011

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

属性レポート

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

Page 47: Hadoop conferencejapan2011

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

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

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

Page 48: Hadoop conferencejapan2011

HUE

Page 49: Hadoop conferencejapan2011

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

Beeswax

HiveQLをWEB UIから 直接叩ける

アドホックな集計

ヒープサイズに注意

Page 50: Hadoop conferencejapan2011

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

HUEの運用

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

HUEのユーザ• 管理者用

MySQLレプリ

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

Page 51: Hadoop conferencejapan2011

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-__'

→ サブクエリを学ぶ

Page 52: Hadoop conferencejapan2011

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

今後の展開• HBase

・・・

CDH3b4

• ログ収集の改善

– Flumeなど

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

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

Page 53: Hadoop conferencejapan2011

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

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

• 2011年4月1日~

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

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

Page 54: Hadoop conferencejapan2011

ありがとうございました