Upload
ichiro-fukuda
View
3.476
Download
0
Embed Size (px)
Citation preview
Hadoop/Hiveを用いたデータ解析基盤の構築
株式会社サイバーエージェント新規開発局福田一郎
2株式会社サイバーエージェント
自己紹介
名前 : 福田一郎 (フクダ イチロー)
所属 : 株式会社サイバーエージェント 新規開発局
略歴 : 2008年 新卒入社
AmebaVision → NinjaTrick → Pigg
→ Patriot(ログ解析基盤)
Twitter : @toutou, はてなID : id:ICHIRO
3株式会社サイバーエージェント
アジェンダ
• ログ解析基盤 Patriot• Patriot概要• システム構成• 開発にあたっての思い
• Hive• Hiveとは• HiveQL
ログ解析基盤 Patriot
5株式会社サイバーエージェント
Amebaサービス
ブログ
なう
Pigg
6株式会社サイバーエージェント
目的
Amebaサービス全体の現状把握と未来予測
7株式会社サイバーエージェント
理由
課金系サービス増加(Pigg,モバイルゲーム)
PV,UUではユーザの定着率は測れない
ユーザに満足してもらえるサービスに
8株式会社サイバーエージェント
方法
ログを収集・集積
ログの構造化
構造化データの解析
ユーザデータとの突き合わせ
9株式会社サイバーエージェント
開発体制
システム 2名
ICHIRO SUZUKI
インフラ
課金系統括
10株式会社サイバーエージェント
システム構成(1)
【NN,JT,SNN】2CoreCPU,16GB RAM各1台
【DN,TT】4CoreCPU,16GB RAM1TB HDD×4 (RAIDなし),全18台
11株式会社サイバーエージェント
システム構成(2)
【Utilサーバ】4CoreCPU,16GB RAM1TB HDD×4 (RAID1)全2台サマリDB,Web/APサーバ
12株式会社サイバーエージェント
システム構成(3)
【Webアプリ】Ruby1.8.7,Rails2.3.8Ext JS3.2.1HUE1.0.1
【Hadoop関連】CDH3 (Hadoop0.20,Hive0.5)Puppet,Nagios,Ganglia
13株式会社サイバーエージェント
解析フロー
UtilHadoopクラスタ
ログ整形Hiveインポート
Hive Job各サービス
サマリDB(MySQL)
サマリデータ
View
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株式会社サイバーエージェント
バッチ処理(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株式会社サイバーエージェント
バッチ処理(3)
• Pigg行動ログ• 2GB/day (gzipファイル)
• 会員データ• プロフィールデータ
• 1000万レコード以上
17株式会社サイバーエージェント
ユーザインタフェース(1)
デイリーサマリマンスリーサマリ定着率レポートカスタムレポート
18株式会社サイバーエージェント
ユーザインタフェース(2)
【HUE】HiveQLをWEB UIから直接叩ける
19株式会社サイバーエージェント
分析の習慣化
• 全サービスの状況を共有• データ抽出依頼を減らす(無くす)• プロデューサもHiveQLを書く• データ解析の啓蒙(Rなど)
20株式会社サイバーエージェント
今後の改善
• ワークフロー(依存関係)• ログ収集の簡易化
• Flume,Scribe,Syslog• 詳細分析
Hive
22株式会社サイバーエージェント
Hiveとは
• Hadoopのサブプロジェクト• Facebookで開発されていた• SQLライクな言語でMap/Redを記述• 同様の試みにPig(スクリプト言語)
23株式会社サイバーエージェント
データモデル
• Primitive• int,float,double,String
• Complex• map<key-type,value-type>• list<element-type>• struct<field-name:field-type>
24株式会社サイバーエージェント
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
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株式会社サイバーエージェント
メタストア
• Hiveの設定やテーブル情報• デフォルトはDerby• PatriotではMySQLを使用
27株式会社サイバーエージェント
データストア
• テーブル : HDFS上のディレクトリ• Partition : テーブルのサブディレクトリ• Bucket : テーブル内のファイル
28株式会社サイバーエージェント
Partition(1)
• Daily,Hourlyでログが分割されている時などに便利
CREATE TABLE test_part(id string)PARTITIONED BY(date string, dev string);
29株式会社サイバーエージェント
Partition(2)
LOAD DATA LOCAL INPATH'/tmp/login_2010-09-30_mb.log'
INTO TABLE test_partPARTITION(
date='2010-09-30',dev='mobile');
30株式会社サイバーエージェント
Bucket
• サンプリングに便利• Map側JOINで効率が良くなる
CREATE TABLE bucket_test(id string) CLUSTERED BY(id) INTO 32 BUCKETS
31株式会社サイバーエージェント
データストアまとめ
login
テーブル Partition
date=2010-10-02
dev=pc
dev=mb
date=2010-10-01
Bucket
32株式会社サイバーエージェント
ファイルフォーマット
• TextFile• SequenceFile• (RCFile)
CREATE TABLE t1(key int, value string)STORED AS SEQUENCEFILE;
33株式会社サイバーエージェント
HiveQL(1)
• JOIN• GROUP BY• UNION ALLなど
SELECT * FROM t1JOIN t2 ON(t1.a2 = t2.b2);
34株式会社サイバーエージェント
HiveQL(2)
INSERT OVERWRITE TABLE t1SELECT * FROM t2;
※ INSERT INTOは存在しない
35株式会社サイバーエージェント
HiveQL(3)
• 集計関数SELECT count(1), sum(c1) FROM t1;
•パーセント点percentile(col, p)
(参考)
http://wiki.apache.org/hadoop/Hive/LanguageManual/UDF
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株式会社サイバーエージェント
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株式会社サイバーエージェント
ファイルフォーマットの検討
圧縮形式:gzip,bzip2,LZOフォーマット:TextFile,SeqenceFile
圧縮率:bzip2>gzip>LZOインポート時間:LZO>無圧縮>gzip>bzip2計算時間:無圧縮>LZO>gzip>bzip2
※シーケンスファイルより丸ごと圧縮の方が圧縮率は高いがスプリットできない分 計算速度で不利
39株式会社サイバーエージェント
構築しての感想
• スケールする安心感• Hiveは結構速い(生Hadoopと遜色ない)• 気軽にいろいろやってみたくなる• 解析の重要性を啓蒙
→ 作って終わりではない
質疑応答
ありがとうございました