Hadoop conferencejapan2011

13,751 views

Published on

Published in: Technology, News & Politics

Hadoop conferencejapan2011

  1. 1. Hiveを用いた Amebaサービスのログ解析共通基盤 -Hadoop Conference Japan 2011- 株式会社サイバーエージェント アメーバ事業本部 プラットフォームディヴィジョン コアテクノロジーグループ 福田 一郎
  2. 2. 2 株式会社サイバーエージェント 自己紹介 名前 : 福田一郎 (フクダ イチロー) 所属 : 株式会社サイバーエージェント アメーバ事業本部 プラットフォームディヴィジョン コアテクノロジーグループ (新卒入社3年目) (過去) • Ameba Pigg運用,開発 (現在) • ログ解析基盤 「Patriot」設計,開発,運用 【Twitter】 @toutou 【はてなID】 id:ICHIRO
  3. 3. 3 株式会社サイバーエージェント アジェンダ • アメーバについて • ログ解析基盤Patriot • Hive • Patriotの構成と運用
  4. 4. アメーバについて
  5. 5. 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. 6. 6 株式会社サイバーエージェント Amebaサービス ブログ なう Pigg
  7. 7. 7 株式会社サイバーエージェント アメーバピグ Pigg for Android
  8. 8. 8 株式会社サイバーエージェント モバイルゲーム
  9. 9. Ameba と Hadoop
  10. 10. 10 株式会社サイバーエージェント Hadoop使用実績 アメーバピグ (HDFS) アクセス解析(0.13.1) pico (Amazon EMR, Pig)
  11. 11. ログ解析基盤 Patriot
  12. 12. 12 株式会社サイバーエージェント Patriot開発までの経緯 [2009年] 11月13日 Hadoop Conference Japan 2009 ー CDH,Hiveなどを知る 11月21日~23日 開発合宿@伊豆高原 ー 統合ログ解析基盤が必要という結論に至る 11月27日 局長に相談 → 即GOサイン [2010年] 3月末 本格検証開始 7月 第1弾リリース,11月 WebUIを中心にリニューアル
  13. 13. 13 株式会社サイバーエージェント 標準的なサービス開発体制 プロデューサ インフラエンジニアアプリエンジニア 課金系担当 会員獲得系担当 数値を 知りたい
  14. 14. 14 株式会社サイバーエージェント 今までの問題点 • 各サービスごとに独自に解析 – プロフィールデータとの結合など定型的なものも • ログ容量の肥大化 – 消されていくログ • サービス開発担当者が解析部分にまで手が回らない – モバイルゲームなど開発スピードが速い – サービスリリースしてスグに情報が欲しい
  15. 15. 15 株式会社サイバーエージェント 目的 Amebaサービス全体の 統合的な現状把握と未来予測 各サービスのデータを集約 サービス開発支援
  16. 16. 16 株式会社サイバーエージェント 方法 • ログの集約 – HDFS • ログの集計 – Map/Reduce • ログの構造化 – Hive • 集計結果の表示 – Patriot WebUI (CIC) • アドホックな集計,解析 – HUE
  17. 17. Hive
  18. 18. 18 株式会社サイバーエージェント Hiveとは • Hadoopのサブプロジェクト • Facebookで開発されていた • SQLライクな言語でMap/Redを記述 • 同様の試みにPig(スクリプト言語)
  19. 19. 19 株式会社サイバーエージェント Hiveの特徴 • HiveQL – SQLのような言語でMapReduceを実行 • メタストア – テーブルのカラム情報などを保持 – デフォルトはDerby – PatriotではMySQLを使用 • 行単位での更新ができない – Partitionを使う
  20. 20. 20 株式会社サイバーエージェント データストア login テーブル Partition date=2011-02-23 dev=pc dev=mb date=2011-02-22 Bucket
  21. 21. 21 株式会社サイバーエージェント データモデル • Primitive • int,float,double,String • Complex • map<key-type,value-type> • list<element-type> • struct<field-name:field-type>
  22. 22. 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. 23. 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. 24. 24 株式会社サイバーエージェント HiveQL(1) • JOIN,LEFT OUTER JOIN • GROUP BY • UNION ALL など SELECT * FROM t1 JOIN t2 ON(t1.a2 = t2.b2);
  25. 25. 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. 26. 26 株式会社サイバーエージェント SerDe(1) • Serialization/Deserialization • カラムの区切り文字などを定義 CREATE TABLE test(c1 string, c2 int) ROW FORMAT DELIMITED FIELDS TERMINATED BY '¥t' LINES TERMINATED BY '¥n'; ichiro[tab]16 suzuki[tab]51 c1 ichiro suzuki c2 16 51
  27. 27. 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");
  28. 28. Patriotの構成と運用
  29. 29. 29 株式会社サイバーエージェント 開発体制 システム 3名 インフラ 都度対応 課金系担当会員獲得系担当
  30. 30. 30 株式会社サイバーエージェント 解析フロー ログ転送 Util Hadoop クラスタ ログ整形 Hiveインポート Hive Job各サービス サマリDB(MySQL) サマリデータ View
  31. 31. 31 株式会社サイバーエージェント システム構成(サーバ1) 【NN,JT,SNN】 2CoreCPU,16GB RAM 各1台 (Dell R300) 【DN,TT】 4CoreCPU,16GB RAM 1TB HDD×4 (RAIDなし), 全18台 (Dell R410)
  32. 32. 32 株式会社サイバーエージェント システム構成(サーバ2) 【Utilサーバ】 4CoreCPU,16GB RAM 1TB HDD×4 (RAID1) 全2台 サマリDB,Web/APサーバ (Dell R410)
  33. 33. 33 株式会社サイバーエージェント システム構成(アプリ) 【Webアプリ】 Ext JS3.2.1 HUE1.0.1 【Hadoop関連】 CDH3 (Hadoop0.20,Hive0.5) Puppet,Nagios,Ganglia 【ジョブ管理】 Hinemos 3.2
  34. 34. 34 株式会社サイバーエージェント システム構成(misc) Hadoop クラスタ 踏み台サーバ NameNodeはNFSでバックアップ
  35. 35. 35 株式会社サイバーエージェント ファイルフォーマットの検討 圧縮形式 : gzip,bzip2,LZO フォーマット : TextFile,SeqenceFile 圧縮率 : bzip2>gzip>LZO インポート時間 : LZO>無圧縮>gzip>bzip2 計算時間 : 無圧縮>LZO>gzip>bzip2 → Patriotではgzip,SeqenceFile,ブロック単位の圧縮を使用中 → MapOutputはLZOで圧縮
  36. 36. 36 株式会社サイバーエージェント インポート処理 ログ転送 Util Hadoop クラスタ 各サービス SCP HDFS get • 正規表現でマッチするレコードを抽出 • gzip,SeqenceFileでHDFS上に出力 • Hiveにロード
  37. 37. 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. 38. 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. 39. 39 株式会社サイバーエージェント 集計処理 Util Hadoop クラスタ サマリDB(MySQL) サマリデータHive Job
  40. 40. 40 株式会社サイバーエージェント 集計・解析処理 DSL mysql { host "localhost" port 3306 username "patriot-batch" password "xxx database "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. 41. 41 株式会社サイバーエージェント ゲーム関連の集計 • モバイルゲーム – ゲームごとにパーティションを作る • Pigg内ゲーム – 釣り,カジノゲーム – UNION ALLで合わせて集計 テーブル game_login Partition 日付 ゲームID
  42. 42. 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. 43. 43 株式会社サイバーエージェント 運用上の数字 • HiveQLクエリ • デイリー(定型)・・・約600 • マンスリー(定型)・・・約700 • 会員データレコード数・・・1300万以上 • ログ容量(デイリー) • Pigg・・・4.5GB(圧縮後) • タレントブログ関連(ログインユーザのみ) ・・・5.5GB(圧縮後) • 処理時間(全集計)・・・3~4時間
  44. 44. Webインタフェース (CIC)
  45. 45. 45 株式会社サイバーエージェント デイリー,マンスリーサマリ
  46. 46. 46 株式会社サイバーエージェント 属性レポート 性別・年齢など属性ごとの割合
  47. 47. 47 株式会社サイバーエージェント タレントブログ解析(大和) あるタレントのブログを見ている人の属性
  48. 48. HUE
  49. 49. 49 株式会社サイバーエージェント Beeswax HiveQLをWEB UIから 直接叩ける アドホックな集計 ヒープサイズに注意
  50. 50. 50 株式会社サイバーエージェント HUEの運用 • Hiveメタストア(マスター) • HDFSへの書き込み権限のある HUEのユーザ • 管理者用 MySQLレプリ • Hiveメタストア(スレーブ) • HDFSへの書き込み権限無し • プロデューサ用
  51. 51. 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. 52. 52 株式会社サイバーエージェント 今後の展開 • HBase ・・・ CDH3b4 • ログ収集の改善 – Flumeなど • レコメンドなど実験的にやっているものを本格化 • 「なう」などグラフ構造を使った解析
  53. 53. 53 株式会社サイバーエージェント Ameba Technology Laboratory • 秋葉原ダイビルに開設 • 2011年4月1日~ • 研究開発、実験的サービス、産学連携 • 勉強会スペース (20~30人)
  54. 54. ありがとうございました

×