More Related Content Similar to 20100930 sig startups Similar to 20100930 sig startups (20) 20100930 sig startups2. 株式会社サイバーエージェント
2
自己紹介
名前 : 福田一郎 (フクダ イチロー)
所属 : 株式会社サイバーエージェント 新規開発局
略歴 : 2008年 新卒入社
AmebaVision → NinjaTrick → Pigg
→ Patriot(ログ解析基盤)
Twitter : @toutou, はてなID : id:ICHIRO
3. 株式会社サイバーエージェント
3
アジェンダ
• ログ解析基盤 Patriot
• Patriot概要
• システム構成
• 開発にあたっての思い
• Hive
• Hiveとは
• HiveQL
7. 株式会社サイバーエージェント
7
理由
課金系サービス増加
(Pigg,モバイルゲーム)
PV,UUではユーザの定着率は測れない
ユーザに満足してもらえるサービスに
10. 株式会社サイバーエージェント
10
システム構成(1)
【NN,JT,SNN】
2CoreCPU,16GB RAM
各1台
【DN,TT】
4CoreCPU,16GB RAM
1TB HDD×4 (RAIDなし),
全18台
11. 株式会社サイバーエージェント
11
システム構成(2)
【Utilサーバ】
4CoreCPU,16GB RAM
1TB HDD×4 (RAID1)
全2台
サマリDB,Web/APサーバ
12. 株式会社サイバーエージェント
12
システム構成(3)
【Hadoop関連】
CDH3 (Hadoop0.20,Hive0.5)
Puppet,Nagios,Ganglia
【Webアプリ】
Ruby1.8.7,Rails2.3.8
Ext JS3.2.1
HUE1.0.1
13. 株式会社サイバーエージェント
13
解析フロー
ログ整形
Hiveインポート
各サービス Util Hive Job
Hadoop
クラスタ
サマリデータ
View サマリDB(MySQL)
14. 株式会社サイバーエージェント
14
バッチ処理(1)
Ruby DSL
import {
service "mypage_uu_mobile"
backup_dir "/log2/mypage_uu_mobile"
data { ← ログデータの場所
type "scp"
servers ["xxx.yyy.zzz.1", "xxx.yyy.zzz.2"]
user "cy_batch"
path "/usr/local/tomcat/logs/login/login_amebaId.#{$dt}"
}
(つづく)
15. 株式会社サイバーエージェント
15
バッチ処理(2)
Ruby DSL
cleaning { ← Map/Reduceを用いたログ整形
mapper "#{$home}/lib/mypage_uu_mapper.rb"
reducer "#{$home}/lib/unique_key_reducer.rb"
}
hive_import { ← Hiveインポート
mypage_uu {
regexp "^([^¥¥t]*)¥¥t$"
output "$1"
partition "dt" => "#{$dt}", "dev" => "mobile"
}
}
}
16. 株式会社サイバーエージェント
16
バッチ処理(3)
• Pigg行動ログ
• 2GB/day (gzipファイル)
• 会員データ
• プロフィールデータ
• 1000万レコード以上
19. 株式会社サイバーエージェント
19
分析の習慣化
• 全サービスの状況を共有
• データ抽出依頼を減らす(無くす)
• プロデューサもHiveQLを書く
• データ解析の啓蒙(Rなど)
20. 株式会社サイバーエージェント
20
今後の改善
• ワークフロー(依存関係)
• ログ収集の簡易化
• Flume,Scribe,Syslog
• 詳細分析
22. 株式会社サイバーエージェント
22
Hiveとは
• Hadoopのサブプロジェクト
• Facebookで開発されていた
• SQLライクな言語でMap/Redを記述
• 同様の試みにPig(スクリプト言語)
23. 株式会社サイバーエージェント
23
データモデル
• Primitive
• int,float,double,String
• Complex
• map<key-type,value-type>
• list<element-type>
• struct<field-name:field-type>
24. 株式会社サイバーエージェント
24
SerDe(1)
• Serialization/Deserialization
• カラムの区切り文字などを定義
CREATE TABLE test(c1 string, c2 int)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '¥t'
LINES TERMINATED BY '¥n';
c1 c2
ichiro[tab]16
suzuki[tab]51 ichiro 16
suzuki 51
25. 株式会社サイバーエージェント
25
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");
26. 株式会社サイバーエージェント
26
メタストア
• Hiveの設定やテーブル情報
• デフォルトはDerby
• PatriotではMySQLを使用
27. 株式会社サイバーエージェント
27
データストア
• テーブル : HDFS上のディレクトリ
• Partition : テーブルのサブディレクトリ
• Bucket : テーブル内のファイル
28. 株式会社サイバーエージェント
28
Partition(1)
• Daily,Hourlyでログが分割されている時な
どに便利
CREATE TABLE test_part(id string)
PARTITIONED BY(date string, dev string);
29. 株式会社サイバーエージェント
29
Partition(2)
LOAD DATA LOCAL INPATH
'/tmp/login_2010-09-30_mb.log'
INTO TABLE test_part
PARTITION(
date='2010-09-30',
dev='mobile');
30. 株式会社サイバーエージェント
30
Bucket
• サンプリングに便利
• Map側JOINで効率が良くなる
CREATE TABLE bucket_test(id string)
CLUSTERED BY(id) INTO 32 BUCKETS
31. 株式会社サイバーエージェント
31
データストアまとめ
テーブル Partition Bucket
login date=2010-10-01 dev=pc
date=2010-10-02
dev=mb
32. 株式会社サイバーエージェント
32
ファイルフォーマット
• TextFile
• SequenceFile
• (RCFile)
CREATE TABLE t1(key int, value string)
STORED AS SEQUENCEFILE;
33. 株式会社サイバーエージェント
33
HiveQL(1)
• JOIN
• GROUP BY
• UNION ALL
など
SELECT * FROM t1
JOIN t2 ON(t1.a2 = t2.b2);
34. 株式会社サイバーエージェント
34
HiveQL(2)
INSERT OVERWRITE TABLE t1
SELECT * FROM t2;
※ INSERT INTOは存在しない
35. 株式会社サイバーエージェント
35
HiveQL(3)
• 集計関数
SELECT count(1), sum(c1) FROM t1;
•パーセント点
percentile(col, p)
(参考)
http://wiki.apache.org/hadoop/Hive/LanguageManual/UDF
36. 株式会社サイバーエージェント
36
HiveQL(4)
• UDF,UDAF
add jar hive-test-1.0-SNAPSHOT.jar;
CREATE TEMPORARY FUNCTION md AS
'jp.ameba.patriot.hive.udf.UDFMessageDigest';
SELECT md(id) FROM login;
37. 株式会社サイバーエージェント
37
UDFの作り方
public class UDFMessageDigest extends UDF {
private static final String DEFAULT_ALGORITHM = "SHA-1";
public String evaluate(String s, String algo, boolean upper) {
try {
StringBuilder builder = new StringBuilder();
MessageDigest md = MessageDigest.getInstance(algo);
byte[] digest = md.digest(s.getBytes("ASCII"));
・・・
return builder.toString();
} catch (・・・)
}
public String evaluate(String s, String algo) {
return evaluate(s, algo, false);
}
}
38. 株式会社サイバーエージェント
38
ファイルフォーマットの検討
圧縮形式:gzip,bzip2,LZO
フォーマット:TextFile,SeqenceFile
圧縮率:bzip2>gzip>LZO
インポート時間:LZO>無圧縮>gzip>bzip2
計算時間:無圧縮>LZO>gzip>bzip2
※シーケンスファイルより丸ごと圧縮の方が圧縮
率は高いがスプリットできない分 計算速度で不利
39. 株式会社サイバーエージェント
39
構築しての感想
• スケールする安心感
• Hiveは結構速い(生Hadoopと遜色ない)
• 気軽にいろいろやってみたくなる
• 解析の重要性を啓蒙
→ 作って終わりではない