More Related Content
Similar to 20130927 adstir emr
Similar to 20130927 adstir emr (20)
20130927 adstir emr
- 1. Copyright © UNITED, Inc. All Rights Reserved.Copyright © UNITED, Inc. All Rights Reserved.
AdStir
SSP(RTB)を支える集計インフラの変遷
1
2013.09.27
- 2. Copyright © UNITED, Inc. All Rights Reserved.
自己紹介
• @fukata (github: fukata)
• ログ周り, バッチ系
• Fluentd, EMR
• Perl, Ruby, Go
• 食べ歩き, 写真
2
- 3. Copyright © UNITED, Inc. All Rights Reserved.
アジェンダ
• UNTIED, inc
• AdStir
• 集計インフラの変遷
• TODO
3
- 7. Copyright © UNITED, Inc. All Rights Reserved.
SSP
7
自社広告
AdStir公認アドネットワーク 他社アドネットワーク
配分比率(%)に応じて抽選
RTB
自社広告
RTB
公認
在庫切れの場合, 再抽選
他社
Browser 他アドネットワークAdStir
- 8. Copyright © UNITED, Inc. All Rights Reserved.
RTB
8
AdStir DSPs
50ms
DSP A
DSP B
DSP C
オークション
bid
bid
bid
bid
Browser
- 9. Copyright © UNITED, Inc. All Rights Reserved.
ログ
• 1,000,000,000 レコード / 日
• 800 GB(非圧縮) / 日
9
- 11. Copyright © UNITED, Inc. All Rights Reserved.
集計インフラ(2011)
11
rsync
perlスクリプトで集計
AD
(syslog)
AD
(syslog)
Batch
mysql
- 12. Copyright © UNITED, Inc. All Rights Reserved.
問題点 1
• ログファイルが日別
• ログファイルが単一サーバに集中
• rsyncがこけた時のリカバリーが手動
• 集計がスケールしにくい・・・
12
- 13. Copyright © UNITED, Inc. All Rights Reserved.
問題点 2
• 物理サーバ
• 急なリクエスト増加に対応できない
• 一度増やすと簡単にサーバ減らせない
• 回線使用料がランニングコストの1/3
13
- 15. Copyright © UNITED, Inc. All Rights Reserved.
集計インフラ(2013.04)
15
fluentd
fluentd
Batch
AD
(fluentd)
AD
(fluentd)
fluentd
logslogslogs
ELB
perl
logs/YYYY/MM/DD/HH/${tag}.log.0.gz
S3
mysql
- 16. Copyright © UNITED, Inc. All Rights Reserved.
問題点 1
• ログファイルが日別
=> 時間別に変更
• ログファイルが単一サーバに集中
• rsyncがこけた時のリカバリーが手動
=> fluentdで解決!
• 集計がスケールしにくい・・・
16
- 17. Copyright © UNITED, Inc. All Rights Reserved.
問題点 2
• 物理サーバ => EC2
• 急なリクエスト増加に対応できない
=> 5分程度で追加・投入可能
• 一度増やすと簡単にサーバ減らせない
=> インスタンスをストップするだけ
• 回線使用料がランニングコストの1/3
=> 使った分だけ(従来の1/5くらい)
17
- 19. Copyright © UNITED, Inc. All Rights Reserved.
集計インフラ(現在)
19
fluentd
fluentd
AD
(fluentd)
AD
(fluentd)
ELB
Cluster
EMR
Batch
logs/YYYY/MM/DD/HH/${tag}.log.0.gz
S3
Cluster
mysql
- 20. Copyright © UNITED, Inc. All Rights Reserved.
問題点
• ログファイルが単一サーバに集中
=> S3にのみアップすることで解決
• 集計がスケールしにくい・・・
=> EMR!!
20
- 21. Copyright © UNITED, Inc. All Rights Reserved.
EMR
• すぐに使い始められる
• クラスタ規模も簡単に変更できる
• クラスタのメンテコスト削減
• 1日以上かかっていた集計が2時間弱で
終わるようになった
21
- 22. Copyright © UNITED, Inc. All Rights Reserved.
JOB FLOWの起動
22
$ elastic-mapreduce --create
--stream
--mapper s3n://BUCKET/path/to/mapper.py
--reducer s3n://BUCKET/path/to/reducer.py
--input s3n://BUCKET/path/to/file1
--output s3n://BUCKET/path/to/output
- 23. Copyright © UNITED, Inc. All Rights Reserved.
デバッグ用オプション
23
$ elastic-mapreduce --create
--keypair KEYPAIR_NAME
--enable-debugging
--log-uri s3n://BUCKET/path/to/debug
--stream
--mapper s3n://BUCKET/path/to/mapper.py
--reducer s3n://BUCKET/path/to/reducer.py
--input s3n://BUCKET/path/to/file1
--output s3n://BUCKET/path/to/output
- 24. Copyright © UNITED, Inc. All Rights Reserved.
JOB FLOWの永続化
24
$ elastic-mapreduce --create
--alive
--keypair KEYPAIR_NAME
--enable-debugging
--log-uri s3n://BUCKET/path/to/debug
$ elastic-mapreduce --jobflow JOBFLOW_ID
--stream
--mapper s3n://BUCKET/path/to/mapper.py
--reducer s3n://BUCKET/path/to/reducer.py
--input s3n://BUCKET/path/to/file1
--output s3n://BUCKET/path/to/output
- 25. Copyright © UNITED, Inc. All Rights Reserved.
実際のオプション例
25
$ elastic-mapreduce --create
--name JOBFLOW_NAME
--keypair KEYPAIR_NAME
--enable-debugging
--log-uri s3n://BUCKET/path/to/debug
--num-instances 5
--master-instance-type m1.large
--slave-instance-type c1.medium
--stream
--jobconf stream.recordreader.compression=gzip
--mapper s3n://BUCKET/path/to/mapper.py
--reducer s3n://BUCKET/path/to/reducer.py
--input s3n://BUCKET/path/to/file1
--output s3n://BUCKET/path/to/output
- 26. Copyright © UNITED, Inc. All Rights Reserved.
elastic-mapreduceコマンド
• 結構色んな事が出来る
• オプションが大量にある
• Ruby 1.8系までしか対応してない
26
- 27. Copyright © UNITED, Inc. All Rights Reserved.
スクリプトでラップ
27
$ perl script/batch EMR::JobRegister
--func rtb_report
--from ‘2013-09-27 13:00:00’
--to ‘2013-09-27 14:00:00’
- 28. Copyright © UNITED, Inc. All Rights Reserved.
出力
28
elastic-mapreduce --create
--name RtbReport
--keypair KEYPAIR_NAME
--enable-debugging
--log-uri s3n://BUCKET/debug/2013/09/27/rtb_report_140000
--num-instances 5
--master-instance-type m1.large
--slave-instance-type c1.medium
--stream
--jobconf stream.recordreader.compression=gzip
--mapper s3n://BUCKET/streaming/rtb_report/mapper.py
--reducer s3n://BUCKET/streaming/rtb_report/reducer.py
--input s3n://BUCKET/logs/2013/09/27/13/bid.*, s3n://BUCKET/logs/2013/09/27/13/
impression.*, s3n://BUCKET/logs/2013/09/27/13/click.*
--output s3n://BUCKET/output/2013/09/27/rtb_report_140000
- 30. Copyright © UNITED, Inc. All Rights Reserved.
TODO
• hive
• streamingでmapper/reducerそれぞれを実装するのが怠い
• アドホックなクエリを気軽に実行できる
• ログデータの中間処理
• 検証では4倍ほど速くなった
• job監視・可視化
• ステータス、実行時間 等
30
- 32. Copyright © UNITED, Inc. All Rights Reserved.
Recruit
• http://united.jp/recruit/
• SSP, RTB配信エンジン, 集計インフラを一
緒に作りませんか?(広告に興味なく
ても大丈夫です)
• go書きたい人
32