狠狠撸

狠狠撸Share a Scribd company logo
株式会社ミクシィ
     石川有
所属
 たんぽぽグループ 解析チーム
 “「刺身の上にタンポポをのせる仕事」 のような単純
   作業の仕事から社内開発者を解放しよう、という
   ミッションの元、たんぽぽグループは技術をベース
   とした様々な仕事や課題解決に携わります。”
担当業務
 解析プラットフォームの構築
 統計解析?データマイニング
 解析などの相談?教育
2012 02-02  mixi engineer's seminor #3
2012 02-02  mixi engineer's seminor #3
2012 02-02  mixi engineer's seminor #3
Perl のみでは大規模データ処理が大変
  データの結合などの処理時間,メモリ使用量が膨大
trial & error が多い解析にレビューが向かない
  1つの解析をするのに何営業日も掛かっていた
解析データの分散
  解析したいデータの把握
  データ操作のライブラリの使い方の学習コスト
解析データの再利用性の欠如
  共通して使えたり,使い回しのできるデータが多かっ
  た
アプリエンジニアが解析環境のメンテナンス
  各サービスの解析が属人性を持ってしまう
2012 02-02  mixi engineer's seminor #3
アプリエンジニアの解析環境メンテナンスからの解放
 サービス開発者は,サービス開発に集中してもらいたい
解析に関するレビューからの解放
 コードレビューやDBレビューの手続きコストを無くしたい
アプリ側の実装と解析側の実装の統合
 アプリエンジニアがなにか解析したいサービスを実装したら,自
 動的に解析環境にも反映
アプリ側の環境と解析側の環境の分離
 DBの負荷など気にせず自由に解析
 データを用意するというコストの解放
データや解析の属人性の排除
解析の再現性の向上
処理時間の短縮
データがそこにある,すぐ使える




 解析プラットフォー
     ム
Hadoop
    Hadoop
      mixi ページの管理者向けの解析
    Hive
      定期実行集計,スポット調査
       DAUやデモグラ集計など
      自社開発の Perl フレームワーク Honey
R
    データマイニング
      多変量解析,クラスタリング etc
    統計的検定
      A/B テスト の検定 etc
アクセスログ etc              Hadoop Cluster



             保存用ストレージ
 MySQL DB               Hadoop Cluster




  ?定期実行集計 → Hive
  ?カウント以上の解析 → R
Strong Point       Weak Point
       大規模データが扱える          バッチ処理向き
       正規表現,JSONで扱える       「集計」以上のことが難しい
       SQL を知っている人の学習コスト
Hive

        処理は基本的にオンメモリで行うの    大規模データの扱いが難しい
       で,ロードさえ出来れば高速        データ結合もできるが,Hive
        統計解析,データマイニングのライ   に比べると遅い
       ブラリが充実               半構造化データの扱いに弱い
 R
A data warehouse system for Hadoop
Hadoop 上で動作するオープンソースのデータウェ
アハウス
HiveQL という SQL like な言語で,Hadoop 上のデー
タを操作
  JOIN, OUTER JOIN
    データ結合処理が簡単,かつ高速に処理できる
  UNION ALL なども利用できる
便利な機能
  PARTITIONによる処理単位の分離
  テーブル操作などにJSON parser が利用できる
Hive 上の1つのテーブル内でデータの独立性をも
たせる
 Hive は基本的には全件処理
 処理すべきデータを PARTITION で区切れる

日単位でなど PARTITION に利用できる
構造が同じデータであれば,1つのテーブルで複
数のデータを扱える
 「ラベル」的な利用ができる
Hive上のあるテーブルに1年分のデータが
 格納
   PARTITION なし



                    1年分のデータを処理


日ごとの PARTITION あり



                    対象の日付けのみを処理
複数 Event のデータの同居できる


                       Event A のみを処理



日,Event で PARTITION




                      Event B のある日のみを処理
闯厂翱狈の连想配列
                 {“user”:”A”, “post_time”:”20120202000000”, “via”:”mobile”}
     Log         {“user”:”B”, “post_time”:”20120202000001”, “via”:”PC”}
                 {“user”:”C”, “post_time”:”20120202000002”, “via”:”Application”}




                 JSON文字列に対して SELECT
                  SELECT user, post_time, via
Hive Table        FROM table t
                   LATERAL VIEW json_tuple(t.json, ‘user’, ‘post_time’, ‘via’)
CREATE TABLE (     AS user, post_time, via;
  json STRING
);
闯厂翱狈の连想配列
MySQL などの VIEW に相当する定義にも利用でき
        {“user”:”A”, “post_time”:”20120202000000”, “via”:”mobile”}
   Log  {“user”:”B”, “post_time”:”20120202000001”, “via”:”PC”}
る       {“user”:”C”, “post_time”:”20120202000002”, “via”:”Application”}




                  JSON文字列に対して SELECT
                   SELECT user, post_time, via
  Hive Table       FROM table t
                    LATERAL VIEW json_tuple(t.json, ‘user’, ‘post_time’, ‘via’)
 CREATE TABLE (     AS user, post_time, via;
   json STRING
 );
2012 02-02  mixi engineer's seminor #3
Hive 用 Perl フレームワーク
セスログ etc              Hadoop Cluster




           保存用ストレージ
ySQL DB               Hadoop Cluster
Honey の目的
             エンジニアの解析環境開発のコスト低減
セスログ etc                                Hadoop Cluster
          Honey の機能
             分散した解析データの Hive へのロードのインタ
           フェース
                        保存用ストレージ
             Hive による定期集計の記述の統一と簡略化
ySQL DB                               Hadoop Cluster
             User Event 用 Hive スキーマの自動生成
アプリエンジニアが解析したいデータを新規追加,
変更を加えたとき
 Hive のスキーマの変更
  スキーマ変更の確認や実行依頼などの手続き
 Hive へのデータの入れなおし
  解析業務の停滞

アプリエンジニアの解析環境メンテナンスからの解放ができない




アプリエンジニアが取りたいデータの追加?変更があったら,
        解析環境も連動して欲しい
闯厂翱狈形式
           PARTITION を利用
CREATE TABLE log (                         ボイス投稿のログ
   JSON STRING
)
PARTITIONED BY (                           日記のコメントのログ
   dt STRING,
   event STRING        Event ごと
);
                                           フォトのイイネ!のログ




    User Event のすべてのログを1つのHiveテーブルで管
   理
    PARTITION で User Event の種類ごとに「区切る」
    各ログにどのような値が含まれるかは,YAMLで別定義
JSON parser 関数を利用
CREATE VIEW voice_create
AS
SELECT
   t.dt
   user, post_time, ….
FROM (
   SELECT s.dt, s.json FROM log s
   WHERE event = ‘diary.create'
)t
LATERAL VIEW json_tuple(s.json, ‘user’, ..)   日記コメントを扱うための VIEW
 AS user, post_time, …




       各 UserEvent の VIEW をYAMLファイルから自動生成
         Hiveテーブルへのデータの取り込みと VIEW の自動生成はcron で実
         行
インタフェースと実体を分離により,
  インタフェースを自由に変更             User Event Log




              Hive Table
 Hive VIEW

                      データ形式はJSONで統一
                     連想配列の内容は自由に変更
インタフェースと実体を分離により,
  インタフェースを自由に変更             User Event Log




 アプリエンジニアのHiveのスキーマ定義などからの解放

              Hive Table
 Hive VIEW

                      データ形式はJSONで統一
                     連想配列の内容は自由に変更
mixi における解析環境
 過去の解析環境の問題点
 Hadoop/Hive/Rを利用

Hive の機能紹介
 PARTITION
 JSON parser や正規表現
Hive 用フレームワーク Honey
 エンジニアの「たんぽぽなお仕事」からの解放
  PARTITION や JSON parser を利用することで,
  サービス側の変更と Hive を連動

More Related Content

2012 02-02 mixi engineer's seminor #3

  • 2. 所属 たんぽぽグループ 解析チーム “「刺身の上にタンポポをのせる仕事」 のような単純 作業の仕事から社内開発者を解放しよう、という ミッションの元、たんぽぽグループは技術をベース とした様々な仕事や課題解決に携わります。” 担当業務 解析プラットフォームの構築 統計解析?データマイニング 解析などの相談?教育
  • 6. Perl のみでは大規模データ処理が大変 データの結合などの処理時間,メモリ使用量が膨大 trial & error が多い解析にレビューが向かない 1つの解析をするのに何営業日も掛かっていた 解析データの分散 解析したいデータの把握 データ操作のライブラリの使い方の学習コスト 解析データの再利用性の欠如 共通して使えたり,使い回しのできるデータが多かっ た アプリエンジニアが解析環境のメンテナンス 各サービスの解析が属人性を持ってしまう
  • 8. アプリエンジニアの解析環境メンテナンスからの解放 サービス開発者は,サービス開発に集中してもらいたい 解析に関するレビューからの解放 コードレビューやDBレビューの手続きコストを無くしたい アプリ側の実装と解析側の実装の統合 アプリエンジニアがなにか解析したいサービスを実装したら,自 動的に解析環境にも反映 アプリ側の環境と解析側の環境の分離 DBの負荷など気にせず自由に解析 データを用意するというコストの解放 データや解析の属人性の排除 解析の再現性の向上 処理時間の短縮
  • 10. Hadoop Hadoop mixi ページの管理者向けの解析 Hive 定期実行集計,スポット調査 DAUやデモグラ集計など 自社開発の Perl フレームワーク Honey R データマイニング 多変量解析,クラスタリング etc 統計的検定 A/B テスト の検定 etc
  • 11. アクセスログ etc Hadoop Cluster 保存用ストレージ MySQL DB Hadoop Cluster ?定期実行集計 → Hive ?カウント以上の解析 → R
  • 12. Strong Point Weak Point 大規模データが扱える バッチ処理向き 正規表現,JSONで扱える 「集計」以上のことが難しい SQL を知っている人の学習コスト Hive 処理は基本的にオンメモリで行うの 大規模データの扱いが難しい で,ロードさえ出来れば高速 データ結合もできるが,Hive 統計解析,データマイニングのライ に比べると遅い ブラリが充実 半構造化データの扱いに弱い R
  • 13. A data warehouse system for Hadoop
  • 14. Hadoop 上で動作するオープンソースのデータウェ アハウス HiveQL という SQL like な言語で,Hadoop 上のデー タを操作 JOIN, OUTER JOIN データ結合処理が簡単,かつ高速に処理できる UNION ALL なども利用できる 便利な機能 PARTITIONによる処理単位の分離 テーブル操作などにJSON parser が利用できる
  • 15. Hive 上の1つのテーブル内でデータの独立性をも たせる Hive は基本的には全件処理 処理すべきデータを PARTITION で区切れる 日単位でなど PARTITION に利用できる 構造が同じデータであれば,1つのテーブルで複 数のデータを扱える 「ラベル」的な利用ができる
  • 16. Hive上のあるテーブルに1年分のデータが 格納 PARTITION なし 1年分のデータを処理 日ごとの PARTITION あり 対象の日付けのみを処理
  • 17. 複数 Event のデータの同居できる Event A のみを処理 日,Event で PARTITION Event B のある日のみを処理
  • 18. 闯厂翱狈の连想配列 {“user”:”A”, “post_time”:”20120202000000”, “via”:”mobile”} Log {“user”:”B”, “post_time”:”20120202000001”, “via”:”PC”} {“user”:”C”, “post_time”:”20120202000002”, “via”:”Application”} JSON文字列に対して SELECT SELECT user, post_time, via Hive Table FROM table t LATERAL VIEW json_tuple(t.json, ‘user’, ‘post_time’, ‘via’) CREATE TABLE ( AS user, post_time, via; json STRING );
  • 19. 闯厂翱狈の连想配列 MySQL などの VIEW に相当する定義にも利用でき {“user”:”A”, “post_time”:”20120202000000”, “via”:”mobile”} Log {“user”:”B”, “post_time”:”20120202000001”, “via”:”PC”} る {“user”:”C”, “post_time”:”20120202000002”, “via”:”Application”} JSON文字列に対して SELECT SELECT user, post_time, via Hive Table FROM table t LATERAL VIEW json_tuple(t.json, ‘user’, ‘post_time’, ‘via’) CREATE TABLE ( AS user, post_time, via; json STRING );
  • 21. Hive 用 Perl フレームワーク
  • 22. セスログ etc Hadoop Cluster 保存用ストレージ ySQL DB Hadoop Cluster
  • 23. Honey の目的 エンジニアの解析環境開発のコスト低減 セスログ etc Hadoop Cluster Honey の機能 分散した解析データの Hive へのロードのインタ フェース 保存用ストレージ Hive による定期集計の記述の統一と簡略化 ySQL DB Hadoop Cluster User Event 用 Hive スキーマの自動生成
  • 24. アプリエンジニアが解析したいデータを新規追加, 変更を加えたとき Hive のスキーマの変更 スキーマ変更の確認や実行依頼などの手続き Hive へのデータの入れなおし 解析業務の停滞 アプリエンジニアの解析環境メンテナンスからの解放ができない アプリエンジニアが取りたいデータの追加?変更があったら, 解析環境も連動して欲しい
  • 25. 闯厂翱狈形式 PARTITION を利用 CREATE TABLE log ( ボイス投稿のログ JSON STRING ) PARTITIONED BY ( 日記のコメントのログ dt STRING, event STRING Event ごと ); フォトのイイネ!のログ User Event のすべてのログを1つのHiveテーブルで管 理 PARTITION で User Event の種類ごとに「区切る」 各ログにどのような値が含まれるかは,YAMLで別定義
  • 26. JSON parser 関数を利用 CREATE VIEW voice_create AS SELECT t.dt user, post_time, …. FROM ( SELECT s.dt, s.json FROM log s WHERE event = ‘diary.create' )t LATERAL VIEW json_tuple(s.json, ‘user’, ..) 日記コメントを扱うための VIEW AS user, post_time, … 各 UserEvent の VIEW をYAMLファイルから自動生成 Hiveテーブルへのデータの取り込みと VIEW の自動生成はcron で実 行
  • 27. インタフェースと実体を分離により, インタフェースを自由に変更 User Event Log Hive Table Hive VIEW データ形式はJSONで統一 連想配列の内容は自由に変更
  • 28. インタフェースと実体を分離により, インタフェースを自由に変更 User Event Log アプリエンジニアのHiveのスキーマ定義などからの解放 Hive Table Hive VIEW データ形式はJSONで統一 連想配列の内容は自由に変更
  • 29. mixi における解析環境 過去の解析環境の問題点 Hadoop/Hive/Rを利用 Hive の機能紹介 PARTITION JSON parser や正規表現 Hive 用フレームワーク Honey エンジニアの「たんぽぽなお仕事」からの解放 PARTITION や JSON parser を利用することで, サービス側の変更と Hive を連動