20100930 sig startups

41
Hadoop/Hiveを用いたデータ解析基盤の構築 株式会社サイバーエージェント 新規開発局 福田一郎

Upload: ichiro-fukuda

Post on 08-Jul-2015

3.476 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: 20100930 sig startups

Hadoop/Hiveを用いたデータ解析基盤の構築

株式会社サイバーエージェント新規開発局福田一郎

Page 2: 20100930 sig startups

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

自己紹介

名前 : 福田一郎 (フクダ イチロー)

所属 : 株式会社サイバーエージェント 新規開発局

略歴 : 2008年 新卒入社

AmebaVision → NinjaTrick → Pigg

→ Patriot(ログ解析基盤)

Twitter : @toutou, はてなID : id:ICHIRO

Page 3: 20100930 sig startups

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

アジェンダ

• ログ解析基盤 Patriot• Patriot概要• システム構成• 開発にあたっての思い

• Hive• Hiveとは• HiveQL

Page 4: 20100930 sig startups

ログ解析基盤 Patriot

Page 5: 20100930 sig startups

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

Amebaサービス

ブログ

なう

Pigg

Page 6: 20100930 sig startups

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

目的

Amebaサービス全体の現状把握と未来予測

Page 7: 20100930 sig startups

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

理由

課金系サービス増加(Pigg,モバイルゲーム)

PV,UUではユーザの定着率は測れない

ユーザに満足してもらえるサービスに

Page 8: 20100930 sig startups

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

方法

ログを収集・集積

ログの構造化

構造化データの解析

ユーザデータとの突き合わせ

Page 9: 20100930 sig startups

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

開発体制

システム 2名

ICHIRO SUZUKI

インフラ

課金系統括

Page 10: 20100930 sig startups

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

システム構成(1)

【NN,JT,SNN】2CoreCPU,16GB RAM各1台

【DN,TT】4CoreCPU,16GB RAM1TB HDD×4 (RAIDなし),全18台

Page 11: 20100930 sig startups

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

システム構成(2)

【Utilサーバ】4CoreCPU,16GB RAM1TB HDD×4 (RAID1)全2台サマリDB,Web/APサーバ

Page 12: 20100930 sig startups

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

システム構成(3)

【Webアプリ】Ruby1.8.7,Rails2.3.8Ext JS3.2.1HUE1.0.1

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

Page 13: 20100930 sig startups

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

解析フロー

UtilHadoopクラスタ

ログ整形Hiveインポート

Hive Job各サービス

サマリDB(MySQL)

サマリデータ

View

Page 14: 20100930 sig startups

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

}(つづく)

Page 15: 20100930 sig startups

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"

}}

}

Page 16: 20100930 sig startups

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

バッチ処理(3)

• Pigg行動ログ• 2GB/day (gzipファイル)

• 会員データ• プロフィールデータ

• 1000万レコード以上

Page 17: 20100930 sig startups

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

ユーザインタフェース(1)

デイリーサマリマンスリーサマリ定着率レポートカスタムレポート

Page 18: 20100930 sig startups

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

ユーザインタフェース(2)

【HUE】HiveQLをWEB UIから直接叩ける

Page 19: 20100930 sig startups

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

分析の習慣化

• 全サービスの状況を共有• データ抽出依頼を減らす(無くす)• プロデューサもHiveQLを書く• データ解析の啓蒙(Rなど)

Page 20: 20100930 sig startups

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

今後の改善

• ワークフロー(依存関係)• ログ収集の簡易化

• Flume,Scribe,Syslog• 詳細分析

Page 21: 20100930 sig startups

Hive

Page 22: 20100930 sig startups

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

Hiveとは

• Hadoopのサブプロジェクト• Facebookで開発されていた• SQLライクな言語でMap/Redを記述• 同様の試みにPig(スクリプト言語)

Page 23: 20100930 sig startups

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

データモデル

• Primitive• int,float,double,String

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

Page 24: 20100930 sig startups

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

Page 25: 20100930 sig startups

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

Page 26: 20100930 sig startups

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

メタストア

• Hiveの設定やテーブル情報• デフォルトはDerby• PatriotではMySQLを使用

Page 27: 20100930 sig startups

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

データストア

• テーブル : HDFS上のディレクトリ• Partition : テーブルのサブディレクトリ• Bucket : テーブル内のファイル

Page 28: 20100930 sig startups

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

Partition(1)

• Daily,Hourlyでログが分割されている時などに便利

CREATE TABLE test_part(id string)PARTITIONED BY(date string, dev string);

Page 29: 20100930 sig startups

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

Partition(2)

LOAD DATA LOCAL INPATH'/tmp/login_2010-09-30_mb.log'

INTO TABLE test_partPARTITION(

date='2010-09-30',dev='mobile');

Page 30: 20100930 sig startups

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

Bucket

• サンプリングに便利• Map側JOINで効率が良くなる

CREATE TABLE bucket_test(id string) CLUSTERED BY(id) INTO 32 BUCKETS

Page 31: 20100930 sig startups

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

データストアまとめ

login

テーブル Partition

date=2010-10-02

dev=pc

dev=mb

date=2010-10-01

Bucket

Page 32: 20100930 sig startups

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

ファイルフォーマット

• TextFile• SequenceFile• (RCFile)

CREATE TABLE t1(key int, value string)STORED AS SEQUENCEFILE;

Page 33: 20100930 sig startups

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

HiveQL(1)

• JOIN• GROUP BY• UNION ALLなど

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

Page 34: 20100930 sig startups

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

HiveQL(2)

INSERT OVERWRITE TABLE t1SELECT * FROM t2;

※ INSERT INTOは存在しない

Page 35: 20100930 sig startups

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

HiveQL(3)

• 集計関数SELECT count(1), sum(c1) FROM t1;

•パーセント点percentile(col, p)

(参考)

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

Page 36: 20100930 sig startups

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;

Page 37: 20100930 sig startups

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

}

Page 38: 20100930 sig startups

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

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

圧縮形式:gzip,bzip2,LZOフォーマット:TextFile,SeqenceFile

圧縮率:bzip2>gzip>LZOインポート時間:LZO>無圧縮>gzip>bzip2計算時間:無圧縮>LZO>gzip>bzip2

※シーケンスファイルより丸ごと圧縮の方が圧縮率は高いがスプリットできない分 計算速度で不利

Page 39: 20100930 sig startups

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

構築しての感想

• スケールする安心感• Hiveは結構速い(生Hadoopと遜色ない)• 気軽にいろいろやってみたくなる• 解析の重要性を啓蒙

→ 作って終わりではない

Page 40: 20100930 sig startups

質疑応答

Page 41: 20100930 sig startups

ありがとうございました