SlideShare a Scribd company logo
継続的データ解析環境の構築

  株式会社adingo エンジニア
      鈴木健太
Meta Information
• 2006.4 – 2012.3
  – Keio University
     • Artificial Intelligence, Semantic Web, Ontology Engineering
• 2011.2 – 2012.3
  – CTO at Trippiece, Inc.
     • Software Engineering
• 2012.4 –
  – Engineer at adingo, Inc.
     • Data Analysis, Operation Engineering


                                                           twitter: @suzu_v
                                                http://blog.kentasuzuki.net
継続的なデータ解析の話をします。
今はこんな業務をしています。




Web広告の技術をCRMに取り入れ、各クラ
イアント様のデータを収集・分析した上で
効果や現状を分かりやすく示し、LTVの引き
上げを行うツールです。
                  http://cosmi.io
基本的な解析のやり方として
• 定点観測
 – 年、月、週、日、時間、分、秒
 – 毎日見ているから気がつくことがある
• アドホック
 – 何か仮説がある場合に、深掘りしていく。
検討


計測        仮説


     実装
解析をする上での
悩みがあります。




       http://www.flickr.com/photos/darwinbell/5827849044/sizes/o/in/photostream/
それは考える時間が減っていく事です。
検討


計測        仮説


     実装
ある日急に、

「ごめん、明日までにAサイトのB商品
 の購買動向について詳細教えてくれ
る?30代男性のあるクラスタに属性し
ているユーザが大量に購入しているみ
     たいなんだよね。」

   という依頼が来る。
Audience Data
       +
Data of Service



      http://www.flickr.com/photos/chef_ele/3791289276/sizes/l/in/photostream/
枠から
人へ         性別
                 年齢

                                 居住




                ?
                                              職業

      興味

                                   趣向



                http://www.flickr.com/photos/catikaoe/232832224/sizes/o/in/photostream/
LOG


     impression
        click
     conversion


ログにはいくつかの種類があります。
  フォーマットが違います。
毎秒                               様々なスパンでログと向き合います。

毎分
毎時
                                                                       months
毎日                                                                      weeks
毎週                                                                       days
毎月                                                                      hours
                                                                      minutes
http://www.flickr.com/photos/gadl/284995199/sizes/o/in/photostream/
                                                                      seconds
Log: X0GB / day

コンスタントにログが増えていきます。
ログの向こう側を見る




    http://www.flickr.com/photos/eole/1394588888/sizes/o/in/photostream/
環境の変化に対応しよう。
より柔軟に解析できる環境を作ろう。
検討


計測        仮説


     実装
Infrastructure of cosmi
大まかな要件
• スケールが容易なログコレクタ
• どんなスキーマが来ても分析容易性を確
  保
• 安定したオーディエンスデータの提供
Adnetworks
                                                                  media
           Web Sites
                                                                   SSP
                                                                   DSP


                       行動ログ



                         Amazon Elastic
                         Load Balancing



行動ログコレクタ(Web)                                  オーディエンスデータ
                                                  Web API



                   …                                                     …
    EC2     EC2                EC2                    EC2       EC2                 EC2
          Auto scaling Group                                  Auto scaling Group




            Amazon Simple            Amazon Elastic
                                                            オーディエンスデータDB
            Storage Service           MapReduce
                                                               (MongoDB)
                 (S3)                ログ解析バッチ


                                                            http://aws.amazon.com/jp/solutions/case-studies/adingo/
AWSを採用した理由(解析視点)
安定したストレージ
S3 -> Elastic MapReduce連携が便利
分析するデータ量が増えてもスケールが
 容易
実際のログ解析
ログ解析にはApache Hiveを
   採用しました。
検討


計測        仮説


     実装
-- EX.) schema of access log
CREATE EXTERNAL TABLE access_log (
   stamp bigint,
   ipaddress string,
   request_status string,
   latency string,
   user_agent string,
   referer string,
   response_out_byte int,
   input_byte int,
   connection string,
   status string
)
PARTITIONED BY (dt string)
STORED AS SEQUENCEFILE
LOCATION 's3n://sample-bucket/access_log/';



 ひと目でスキーマがわかります。
-- defining table for output daily referer count by pages.
CREATE EXTERNAL TABLE daily_referer_count (
    referer string,
    referer_count int
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY 't'
STORED AS TEXTFILE
LOCATION 's3n://sample-
bucket/reports/${EVENTDATE}/daily_referer_count_rankin
g’;


例えばアクセスログからリファラを分析する際には
上のようなテーブルを作り、
集計します。
この場合だと、結果はS3に格納されます。

-- aggregation daily count of each referer.
INSERT OVERWRITE TABLE daily_referer_count
SELECT referer, count(*) AS referer_count FROM
access_log WHERE dt="${EVENTDATE}"
GROUP BY referer
DISTRIBUTE BY referer SORT BY referer_count DESC,
referer ASC
LIMIT 100;
 導入の敷居低い



 何をしているのか一目で分かる
これで手軽にデータについて調べることが
       できます。
あとはこれを継続して回すことが大事です。
検討


計測        仮説


     実装
解析を継続するために必要なこと



 解析までのリードタイムを短くする
 気軽に解析バッチを実行できるようにする
 失敗してもすぐに再実行できる
Deployment & Running Batch
       with Jenkins
解析にもJenkinsを
• Jenkinsの特徴
 – インストール、セットアップが簡単
 – ジョブ設定、通知が容易
   • 「何が起こった時に何をして何を通知するか」
 – プラグイン拡張
• Jenkinsの主な役割
 – 継続的なビルド及びテスト
 – 外部ジョブの監視

                 Welcome to Jenkins CI! | Jenkins CI http://jenkins-ci.org/
Jenkinsをフル活用しています


 ログコレクタとオーディエンスデータAPIの継続
  的デリバリ
 MapReduce用Javaプログラムのテスト・ビル
  ド・s3への配置・実行
 Hiveスクリプトのs3への配置・実行
$ vim apps/hoge/output_log_format
$ git commit –m“#123 ログスキーマを変更”
$ git push origin master




                 push



          Team
push


  Team   mirroring




githubにコードがpushされると、
ローカルのmirrorリポジトリにfetchします。

初期化時
$ git clone --mirror git@github.com:hoge/repos.git
更新時
$ git remote update
push


 Team   mirroring
                        :release
                    ビ
                    ル
                    ド
                    パ
                    イ
                    プ
                    ラ
                    イ
                    ン
                          :master




Jenkinsにはビルドパイプラインが構築してあり、
これによってジョブフローを制御しています。
また、ブランチごとにデプロイ先を変えています。
push


Team       mirroring
                           :release
                       ビ
                       ル
                       ド
                       パ
                       イ
                       プ
                       ラ
                       イ
                       ン
                                                development
                             :master

                                                 EC2




 開発環境にはmasterブランチのコードが
 自動的にデプロイされます。
 この際テストやマイグレーションなども
 同時に行われます。
       $ fab –f app_fabfile.py development deploy testing migrate
push                                   production
                                                                                                …
Team       mirroring                                                        EC2       EC2                 EC2
                           :release                                                  Auto scaling Group

                       ビ                          preview
                       ル
                       ド
                       パ
                       イ
                       プ                                                    EC2
                       ラ     AWS CloudFormation
                       イ
                       ン
                                                            development
                             :master

                                                            EC2
                                                              Servers belonged to certain data domain.




pre環境は都度CloudFormationで立ち上げます。
本番環境にはreleaseブランチのコードをデプロイします。

       $ fab –f app_fabfile.py preview deploy migrate
       $ fab –f app_fabfile.py production deploy migrate
push                                     production
                                                                                                 …
Team     mirroring                                                           EC2       EC2                 EC2
                         :release                                                     Auto scaling Group

                     ビ                             preview
                     ル
                     ド
                     パ
                     イ
                     プ                                                       EC2
                     ラ        AWS CloudFormation
                     イ
                     ン
                                                             development
                              :master

                                                             EC2
                                                               Servers belonged to certain data domain.
       .jarファイルやhiveプログラムの配置




                         S3



もし、MapReduceプログラムやHiveクエリであれば、
ビルド後の成果物をS3に自動的に配置します。
$ s3cmd put --recursive /path/to/workspace/* s3://example/hive/
push                                       production
                                                                                                   …
Team     mirroring                                                             EC2       EC2                 EC2
                           :release                                                     Auto scaling Group

                      ビ                              preview
                      ル
                      ド
                      パ
                      イ
                      プ                                                        EC2
                      ラ         AWS CloudFormation
                      イ
                      ン
                                                               development
                                :master

                                                               EC2
                                                                 Servers belonged to certain data domain.
       .jarファイルやhiveプログラムの配置


                                                そして実際にジョブを実行します。
                          S3
                                                ジョブの実行は任意のタイミング
                                                で行うことができます。
        ジョブの実行                                 $ TODAY=`date +%Y/%m/%d`
                                               $ elastic-mapreduce --create –name LogAggregation 
                                               --num-instances 10 --instance-type m1.small 
                                               --hive-script --arg s3://example/hive/query/1st_step.q 
                     Amazon Elastic
                      MapReduce
                                               --args -d,EVENTDATE=$TODAY --step-name FirstStep
                                               --hive-script --arg s3://example/hive/query/2nd_step.q 
                                               --args -d,EVENTDATE=$TODAY --step-name SecondStep
検討


計測        仮説


     実装
しかしやはり、
人間、
失敗をします。   http://www.flickr.com/photos/proimos/4199675334/sizes/o/in/photostream/
検討

!   計測        仮説


         実装
失敗したらすぐに修正したいものです。
失敗したことを、すぐに知ることが大事です。
そんなときは、
Jenkinsが教えてくれます。
./elastic-mapreduce



                                  Amazon Elastic
                                   MapReduce




MapReduceジョブの実行をまず、Jenkinsから行います。
これは定期的に実行されます。
./elastic-mapreduce



                                       Amazon Elastic
                                        MapReduce


                            Trigger
                            Parameterized
                            Build
param:job_id




       ジョブ実行後、job_idをパラメータとして渡し、
       新たなジョブを実行します。
./elastic-mapreduce



                                         Amazon Elastic
                                          MapReduce


                            Trigger
                            Parameterized
                            Build
param:job_id




                          monitoring
                          state of the job




  新しいジョブによってMapReduceジョブを監視します。
./elastic-mapreduce
                                                          FAILED.

                                         Amazon Elastic
                                          MapReduce


                            Trigger
                            Parameterized
                            Build
param:job_id




                          monitoring
                          state of the job




  仮にここで、ジョブが何らかの原因で失敗したとします。
./elastic-mapreduce
                                                        FAILED.

                                       Amazon Elastic
                                        MapReduce


                            Trigger
                            Parameterized
                            Build
param:job_id




                               Getting Log




   監視ジョブが失敗したことを検知し、
   Elastic MapReduceからapi経由でログを取得します。
./elastic-mapreduce



                                               Amazon Elastic
                                                MapReduce


                                    Trigger
                                    Parameterized
                                    Build
param:job_id




                                       Getting Log



mail, IRC, etc.
including the log.   ジョブが失敗したことを様々な方法で通知します。
                     この際にログ自体も送ります。
検討

!
計測        仮説


     実装
発表のまとめをします。
時間は限られています。
                                     しかし、
                                     調べたいことは山積み。




http://www.flickr.com/photos/bogenfreund/556656621/sizes/o/in/photostream/
1人で解析するのではなく、
周りのメンバーを巻き込みましょう。

誰もがデータについて考えられるような
環境を作りましょう。
しかしやはり、
人間、
失敗をします。   http://www.flickr.com/photos/proimos/4199675334/sizes/o/in/photostream/
なので道具を活かしましょう。
考える時間を
作りましょう。




          http://www.flickr.com/photos/darwinbell/5827849044/sizes/o/in/photostream/
データを観察し、想像しましょう。
角度を変えて、繰り返し繰り返し考えましょう。




           http://www.flickr.com/photos/srtagomez/5416367341/sizes/l/in/photostream/
検討


      計測        仮説


           実装

素早く回し、調べ、考え、またすぐに試しましょう。
継続的な解析ができる環境をつくりましょう。
解析にも
継続的デリバリを



       http://www.flickr.com/photos/columna/236353428/sizes/l/in/photostream/
参考資料
Jenkinsについて
•   Welcome to Jenkins CI! | Jenkins CI
     –   http://jenkins-ci.org/
     –   公式サイトです。
•   Parameterized Build - Jenkins - Jenkins Wiki
     –   https://wiki.jenkins-ci.org/display/JENKINS/Parameterized+Build
     –   パラメータをジョブに渡して実行する方法について書かれています。
•   Parameterized Trigger Plugin - Jenkins - Jenkins Wiki
     –   https://wiki.jenkins-ci.org/display/JENKINS/Parameterized+Trigger+Plugin
     –   パラメータをジョブからジョブに渡して実行するためのプラグインです。MapReduceジョブの監視のためにjob_idを
         渡す際にはこれを利用して監視用ジョブを立ち上げています。
•   Build Pipeline Plugin - Jenkins - Jenkins Wiki
     –   https://wiki.jenkins-ci.org/display/JENKINS/Build+Pipeline+Plugin
     –   ビルドパイプラインを構築するためのプラグインです。ジョブの一連の流れを設定するために利用しています。基本
         的にデプロイやMapReduceに関するジョブについてはgit commitを起点としたパイプラインに配置するようにしてい
         ます。
•   IRC Plugin - Jenkins - Jenkins Wiki
     –   https://wiki.jenkins-ci.org/display/JENKINS/IRC+Plugin
     –   IRCによる通知のためのプラグインです。
•   Email-ext plugin - Jenkins - Jenkins Wiki
     –   https://wiki.jenkins-ci.org/display/JENKINS/Email-ext+plugin
     –   Jenkinsによるメール通知の機能を拡張するプラグインです。
•   O'Reilly Japan - Jenkins
     –   http://www.oreilly.co.jp/books/9784873115344/
     –   オライリー・ジャパンから出版されているJenkins本です。Parameterized Triggerの設定の際に参考にしました。
Elastic MapReduceについて
• Amazon Elastic MapReduce Ruby Client : Developer Tools :
  Amazon Web Services
   – http://aws.amazon.com/developertools/2264
   – 全てのジョブのコントロールはコマンドラインツールを利用していま
     す。Jenkinsからのディスパッチについてもこれを利用しています。
• Running Hive on Amazon Elastic MapReduce : Articles & Tutorials :
  Amazon Web Services
   – http://aws.amazon.com/articles/2857
   – Elastic MapReduce上でのHiveの利用に関する資料がまとまっています。
• Contextual Advertising using Apache Hive and Amazon EMR :
  Articles & Tutorials : Amazon Web Services
   – http://aws.amazon.com/articles/2855
   – Hiveによる分析の実例が示されています。一連の流れが書かれている
     ので、実際に試して見る場合には参考になると思います。
Apache Hiveについて
• Programming Hive - O'Reilly Media
  – http://shop.oreilly.com/product/063692002355
    5.do
  – Hiveに関する仕様がよくまとまっています。
    もちろんWeb上やJIRAで参照できる内容がほ
    とんどですが、手元においておくと安心です。
Fabricについて
• Github: fabric/fabric
  – https://github.com/fabric/fabric
  – デプロイにはfabricを利用しています。python
    製のデプロイツールです。
• Fabric documentation
  – http://docs.fabfile.org/
  – 公式のドキュメントです。やはりここが一番
    情報が多いです。ただ実践的にどのように使
    うか、という点に関しては情報がまだまだ少
    ないです。
cosmi Relationship Suiteについて

• adingo、ディスプレイ広告枠活用型のCRMサービ
  ス「cosmi Relationship Suite」を開発
 – http://pressrelease.adingo.jp/news/2012/07/adingocr
   mcosmi--7f06.html
 – cosmi Relationship Suiteのプレスリリースです。
• 【実はよく知らない】オーディエンスデータプ
  ラットフォームってなに?
 – https://www.facebook.com/note.php?note_id=222292
   327824741
 – DMP、または、オーディエンスデータプラット
   フォームについてまとめた記事です。
その他
• 継続的デリバリのパターン
 – http://www.infoq.com/jp/articles/Continous-
   Delivery-Patterns
 – 継続的デリバリについてよくまとまっていま
   す。私達の行なっている継続的デリバリは簡
   易的なものです。Jenkinsなどのツールを利用
   することで、比較的容易に環境を構築するこ
   とができます。

More Related Content

Jenkinsとhadoopを利用した継続的データ解析環境の構築