ソーシャルゲームのEMR活用事例

6,134 views

Published on

2011-12-15 第一回 EMR勉強会発表資料

Published in: Technology, Business

ソーシャルゲームのEMR活用事例

  1. 1. ソーシャルゲームのEMR活用事例 ∼ユーザに愛されるカスタマーサポートを目指して∼11年12月16日金曜日
  2. 2. 自己紹介 Name:本間 知教(ほんま とものり) Twitter:@CkReal 経歴 2008年4月∼2011年9月 国内某ITコンサルティング会社:インフラ担当 2011年9月∼ 株式会社gumi:インフラand解析チーム 好きなAWS:EMR(とS3) 211年12月16日金曜日
  3. 3. アジェンダ 1.EMR利用に至る経緯 2.gumiのEMR活用事例 3.EMRを使ってみて 311年12月16日金曜日
  4. 4. EMR利用に至る経緯 411年12月16日金曜日
  5. 5. gumiの課題 CS(カスタマーサポート)の応対負荷 エンジニアが調査に時間を取れない NFSサーバが単一障害点 gumiのカスタマーサポート概略図 対応が遅くなりがち APPサーバ ゲームユーザ syslog-ng 転送 質問 回答 回答 NFSサーバ 調査依頼 CS エンジニア 511年12月16日金曜日
  6. 6. 現在のログ状況 例)任侠道のアクションログ 最大18GB(圧縮2.4GB)/日 ログ形式(赤字は整形) 【日付】【ホスト名】【アプリ名】 【アクション名】 【ユーザID】【アクション詳細】 Nov 1 23:59:59 hogehoge-ap1 hogehoge ADD_MONEY 12345 [BeforeMoney] 67979 [AfterMoney] 68024 [Money] 45 Nov 1 23:59:59 hogehoge-ap2 hogehoge CONSUME_POWER 12345 [BeforePower] 25 [AfterPower] 20 [ConsumePower] 5 611年12月16日金曜日
  7. 7. DB投入時のドキュメント形式 ユーザ/時のアクション内容をJSON形式で格納 例)MongoDB格納後のログ(一部整形&省略) "_id" : "df41b04eb72d29b4a30955f2de1a20134e187cd6f59f0d3df0468d22", "app" : "hogehoge", "userid" : "12345", "dateint" : 20111101, "hourint" : 23, ユーザIDごとに、 "actions" : [ アクションレコードを格納 "CONSUME_POWER", "ADD_MONEY" ], 時刻フィールドを利用して、 "records" : [ MongoDBのShardingキーとする { "action" : "ADD_MONEY", "timeint" : 235959, ユーザごとの各アクションを } 配列として格納 ] 711年12月16日金曜日
  8. 8. EMR or EC2? Amazon S3とEMRのコラボが素敵 NFSサーバの障害リスク解消 インスタンスを常時稼動させる必要がない 過去ログからも調査・解析できるようにできる 811年12月16日金曜日
  9. 9. 解析方法の模索 EMR利用時に、何のプロダクトを使うか? Pythonが利用可能なため、Hadoop Streamingを採用 プロダクト メリット デメリット Pig 複雑な処理も記述可能 スクリプト習得コスト ある程度、ログが整形 Hive SQLに近い記述方法 されている必要がある Hadoop Streaming 多くの言語で対応可能 MapReduce習得コスト 911年12月16日金曜日
  10. 10. gumiのEMR活用事例 1011年12月16日金曜日
  11. 11. gumiの解析システム構成Ver0.3 日次で各アプリのアクションログを集計 Amazon S3 Amazon EMR 圧縮アクションログ 集計ログ 圧縮アクションログ 集計ログ 圧縮アクションログ 集計ログ NFSサーバ1 アクションログ DBサーバ Shard1 NFSサーバ2 アクションログ Shard2 圧縮(gzip) Shard3 mongos NFSサーバ3 アクションログ Shard4 アクションログ アクションログ アクションログ config Shard5 バッチサーバ Shard6 11 ReplicaSets & Sharding11年12月16日金曜日
  12. 12. MapReduce処理 2000万件超/日のアクションを約30万件に集計 --bootstrap-action Python2.7インストールスクリプト --mapper アクションログを以下のKey/Valueに整形 [Key]【アプリ名】/【ユーザID】/【日付】/【時刻】 [Value]action:【アクション種別】,timeint:【時刻】,params:{“AAA:123,…”} --reducer Mapperで処理されたValue内のactionを集約 [Value]actions:[【アクション種別1】,【アクション種別2】…] ,records:[action:…] 1211年12月16日金曜日
  13. 13. とある一日のバッチ処理 前日分の各アプリのアクションログを集計 EMRは各アプリごとのクラスタで起動 各アプリのEMR実行は、2h程度で終了 0:00 1:00 3:00 7:00 転送&圧縮 EMR実行 MongoDB挿入 (並列実行) (並列実行) (順次実行) 1311年12月16日金曜日
  14. 14. EMRを使ってみて 1411年12月16日金曜日
  15. 15. EMRを使ってみて S3上のファイルをいつでも利用できる EC2⇔S3間の転送は、20MB/sec程度 必要なときだけ、EMRクラスタを使える Hadoopクラスタを管理する必要がない 変化する要件にも対応しやすい とりあえず、S3に元ファイルはあるしねw 1511年12月16日金曜日
  16. 16. EMRを使ってみて たまにジョブが失敗する Reduce処理が終わらない? 集計ログを回収しきれない? チューニング方法模索中… 毎時集計まで対応予定 ファイルサイズ Master Slave 実行時間 8.4GB m1.xlarge m2.4xlarge × 4台 2h12m 3.2GB c1.xlarge m1.xlarge × 3台 44分 835MB c1.xlarge m1.xlarge × 3台 28分 22GB m2.4xlarge m2.4xlarge × 2台 FAILED… 1611年12月16日金曜日
  17. 17. EMR実行途中のCPU使用率 リニアにスケールさせるのは、なかなか難しい11年12月16日金曜日
  18. 18. ご清聴ありがとうございました。 1811年12月16日金曜日

×