Upgrade to Pro — share decks privately, control downloads, hide ads and more …

BigQueryを使用した分析基盤の運用を進めていく上で見えてきた課題、乗り越えてきた軌跡/2...

Shinichi Takii
September 20, 2018

 BigQueryを使用した分析基盤の運用を進めていく上で見えてきた課題、乗り越えてきた軌跡/20180920-gcn-bigquery

先日登壇した Google Cloud Next '18 in Tokyo の発表資料です。
※Google Cloud Next関係のロゴは削除しています

【概要】
リクルートライフスタイル(RLS)では、じゃらん、ホットペッパーをはじめ、大小 30 以上のサービスを展開おり、それらすべてのデータを集約した分析基盤を構築しています。
柔軟性、強固性、スケーラビリティなど、様々な条件がある中、同社では複数の DWH の共存を選択し、その 1 つとして BigQuery を選びました。
- なぜ BigQuery を選択したのか
- BigQuery を導入・運用して明らかになった課題はどういうものがあるのか
- それらの課題をどう乗り越えたのか
分析基盤全体の構成や、RLS分析基盤の軌跡と共に現場目線でお伝えします。

【発表者】
リクルートライフスタイル 山田 雄さん
SHAKETH 代表 瀧井 伸一

Shinichi Takii

September 20, 2018
Tweet

Other Decks in Technology

Transcript

  1. 分析基盤の変遷 2013 2014 2015 ✔リクルート分社化に伴い、独自の 分析基盤Hadoop提供スタート ✔Netezza, Redshift導入 ✔オンプレ- AWS

    間に専用線導入 ✔Redshift のノード拡張 ✔Netezza のスケール検討 ✔Hadoop 除却 ✔TreasureData 導入 ✔Redshiftのノード 拡張
  2. 分析基盤の変遷 2013 2014 2015 2016 ✔Hadoop 除却 ✔TreasureData 導入 ✔Redshift

    のノード拡張 ✔リクルート分社化に伴い、独自の 分析基盤 Hadoop 提供スタート ✔Netezza, Redshift 導入 ✔オンプレ- AWS 間に専用線導入 ✔Redshift のノード拡張 ✔Netezza のスケール検討 ✔Netezza のスケールアウト完了 ✔Redshift のノード拡張 ✔Redshift の multi クラスタ導入
  3. 分析基盤の変遷 ✔BigQuery 導入 ✔NetezzaEOSL ✔DataLake 構成導入 ✔Exadata 導入 2013 2014

    2015 2016 2017 ✔Hadoop 除却 ✔TreasureData 導入 ✔Redshift のノード拡張 ✔リクルート分社化に伴い、独自の 分析基盤 Hadoop 提供スタート ✔Netezza, Redshift 導入 ✔オンプレ- AWS 間に専用線導入 ✔Redshift のノード拡張 ✔Netezza のスケール検討 ✔Netezza のスケールアウト完了 ✔Redshift のノード拡張 ✔Redshift の multi クラスタ導入
  4. 分析基盤の変遷 2013 2014 2015 2016 2017 2018 ✔TreasureData を一部 BQ

    へ移行 ✔RedshiftSpectrum 導入 ✔Redshift を一部 BQ へ移行 ✔BigQuery 導入 ✔NetezzaEOSL ✔DataLake 構成導入 ✔Exadata 導入 ✔Hadoop 除却 ✔TreasureData 導入 ✔Redshift のノード拡張 ✔リクルート分社化に伴い、独自の 分析基盤 Hadoop 提供スタート ✔Netezza, Redshift 導入 ✔オンプレ- AWS 間に専用線導入 ✔Redshift のノード拡張 ✔Netezza のスケール検討 ✔Netezza のスケールアウト完了 ✔Redshift のノード拡張 ✔Redshift の multi クラスタ導入
  5. S3 分析基盤の概要 Amazon Redshift Spectrum Oracle Exadata SPSS Treasure Data

    aginity CHEETAH DIGITAL Adobe Analytics CSV 外部データ アクセスログ アプリログ HPB JLN HPG 事業データ BigQuery IBM Watson Campaign Automation
  6. Why BigQuery • キャパシティプランニング不要 • フルマネージド • ロード処理と、クエリ処理が分離 • データの受け渡しが容易

    • 定額料金での使用が可能 • 他の Google 製品との親和性 ▪課題解消のための目標 性能劣化しない基盤 インフラ運用からの解放 キャパシティ管理からの解放 さらなるデータ活用の民主化が進む基盤 構造を把握しやすい基盤 インフラをコード化 (terraform) する事で解消
  7. リクルートライフスタイル BigQuery の規模 ※ 2018 年 8 月時点 Server Log

    Amazon Redshift Adobe Analytics Oracle ユーザー数 テーブル数 レコード数 ストレージサイズ 連携データベース 750 4,000 6,000 550 人 個 億件 TB (開発テスト環境含む : 650 TB)
  8. 設計思想 : イベントドリブン & 疎結合 • ファイル出力イベントをトリガーに BigQuery 連携 •

    データ連携パイプラインを各段階で切り分けて、 独立したプロセスで稼働
  9. 設計思想 : イベントドリブン & 疎結合 • ファイル出力イベントをトリガーに BigQuery 連携 •

    データ連携パイプラインを各段階で切り分けて、 独立したプロセスで稼働 • システム間の連携時間調整を大幅に削減 • 変化に柔軟、迅速なデプロイが可能 • 障害が起きても、影響を小さい単位に切り分けられる
  10. Data Pipeline Update job check Kubernetes Engine Load job check

    Kubernetes Engine Data Lake AWS On-premises / Cloud データパイプライン システム概要図 Server Log S3 File copy Kubernetes Engine Data store Cloud Storage DDL Parse & BigQuery Load Kubernetes Engine S3 Notification SQS Load start SQS Load check SQS Update start SQS Table update Kubernetes Engine SQS auto scaler Kubernetes Engine Update check SQS Data warehouse BigQuery Oracle Amazon Redshift Adobe Analytics Slack Logging & Alert Stackdriver
  11. Data Pipeline Update job check Kubernetes Engine Load job check

    Kubernetes Engine Data Lake AWS On-premises / Cloud データパイプライン システム概要図 Server Log S3 File copy Kubernetes Engine Data store Cloud Storage DDL Parse & BigQuery Load Kubernetes Engine S3 Notification SQS Load start SQS Load check SQS Update start SQS Table update Kubernetes Engine SQS auto scaler Kubernetes Engine Update check SQS Data warehouse BigQuery Oracle Amazon Redshift Adobe Analytics Slack Data warehouse Logging & Alert Stackdriver
  12. Data Pipeline Update job check Kubernetes Engine Load job check

    Kubernetes Engine Data Lake AWS On-premises / Cloud データパイプライン システム概要図 Server Log S3 File copy Kubernetes Engine Data store Cloud Storage DDL Parse & BigQuery Load Kubernetes Engine S3 Notification SQS Load start SQS Load check SQS Update start SQS Table update Kubernetes Engine SQS auto scaler Kubernetes Engine Update check SQS Data warehouse BigQuery Oracle Amazon Redshift Adobe Analytics Slack Data File Store Logging & Alert Stackdriver
  13. Data Pipeline Update job check Kubernetes Engine Load job check

    Kubernetes Engine Data Lake AWS On-premises / Cloud データパイプライン システム概要図 Server Log S3 File copy Kubernetes Engine Data store Cloud Storage DDL Parse & BigQuery Load Kubernetes Engine S3 Notification SQS Load start SQS Load check SQS Update start SQS Table update Kubernetes Engine SQS auto scaler Kubernetes Engine Update check SQS Data warehouse BigQuery Oracle Amazon Redshift Adobe Analytics Slack Data Pipeline System Logging & Alert Stackdriver
  14. Data Pipeline Update job check Kubernetes Engine Load job check

    Kubernetes Engine Data Lake AWS On-premises / Cloud データパイプライン システム概要図 Server Log S3 File copy Kubernetes Engine Data store Cloud Storage DDL Parse & BigQuery Load Kubernetes Engine S3 Notification SQS Load start SQS Load check SQS Update start SQS Table update Kubernetes Engine SQS auto scaler Kubernetes Engine Update check SQS Data warehouse BigQuery Oracle Amazon Redshift Adobe Analytics Slack Data Pipeline System キュー管理 データ処理プロセス Logging & Alert Stackdriver
  15. Data Pipeline Update job check Kubernetes Engine Load job check

    Kubernetes Engine Data Lake AWS On-premises / Cloud データパイプライン システム特徴 Server Log S3 File copy Kubernetes Engine Data store Cloud Storage DDL Parse & BigQuery Load Kubernetes Engine S3 Notification SQS Load start SQS Load check SQS Update start SQS Table update Kubernetes Engine SQS auto scaler Kubernetes Engine Update check SQS Data warehouse BigQuery Oracle Amazon Redshift Adobe Analytics Slack ① イベントドリブン S3 バケット通知イベント SQS メッセージを起点に、 各処理もすべて SQS によるキュー管理で連携処理を実行
  16. Data Pipeline Update job check Kubernetes Engine Load job check

    Kubernetes Engine Data Lake AWS On-premises / Cloud データパイプライン システム特徴 Server Log S3 File copy Kubernetes Engine Data store Cloud Storage DDL Parse & BigQuery Load Kubernetes Engine S3 Notification SQS Load start SQS Load check SQS Update start SQS Table update Kubernetes Engine SQS auto scaler Kubernetes Engine Update check SQS Data warehouse BigQuery Oracle Amazon Redshift Adobe Analytics Slack ① イベントドリブン S3 バケット通知イベント SQS メッセージを起点に、 各処理もすべて SQS によるキュー管理で連携処理を実行
  17. Data Pipeline Update job check Kubernetes Engine Load job check

    Kubernetes Engine Data Lake AWS On-premises / Cloud データパイプライン システム特徴 Server Log S3 File copy Kubernetes Engine Data store Cloud Storage DDL Parse & BigQuery Load Kubernetes Engine S3 Notification SQS Load start SQS Load check SQS Update start SQS Table update Kubernetes Engine SQS auto scaler Kubernetes Engine Update check SQS Data warehouse BigQuery Oracle Amazon Redshift Adobe Analytics Slack ② オートスケール ファイルコピー、BigQuery へのロードプロセス等が、 SQS メッセージの増減に応じてオートスケール
  18. Data Pipeline Update job check Kubernetes Engine Load job check

    Kubernetes Engine Data Lake AWS On-premises / Cloud データパイプライン システム特徴 Server Log S3 File copy Kubernetes Engine Data store Cloud Storage DDL Parse & BigQuery Load Kubernetes Engine S3 Notification SQS Load start SQS Load check SQS Update start SQS Table update Kubernetes Engine SQS auto scaler Kubernetes Engine Update check SQS Data warehouse BigQuery Oracle Amazon Redshift Adobe Analytics Slack ③ ジョブ開始・チェック プロセス分離 ロード / テーブル更新処理は、 ジョブの開始と完了チェックを分離することで、 少ないプロセス数で、多くの並列処理をこなせる ロード 完了チェック ロード ジョブ開始 テーブル更新 完了チェック テーブル更新 ジョブ開始
  19. キュー管理に SQS を採用した理由 SQS のデッドレターキューが便利だった • デッドレターキュー とは 正常に処理できなかった問題となるメッセージを別の場所に退避してくれるもの ◦

    インシデントの調査やリカバリが容易になる ◦ 障害検知を実装しやすい (CloudWatch Alert) 用途が単純なメッセージ連携のため、利便性の観点から AWS SQS を採用した ※ Cloud Pub/Subでも独自実装は可能
  20. 用途 プロジェクト データセット 説明 データストア 事業テーブル 7 個 46 個

    • 事業単位にプロジェクトを分割 • データ連携元サービス単位にデータ セットを分割 ログ 2 個 8 個 • Adobe Analytics, Google Analytics でプロジェクト分割 データマート 1 個 11 個 • 事業・サービス単位にデータセットを 分割 ユーザー加工テーブル保存 1 個 3 個 システム用 1 個 23 個 ユーザクエリ実行 2 個 - • アドホック分析, BI ツール実行 ① GCP プロジェクト設計 : 事業・用途 単位で分割 ※ 2018 年 8 月時点
  21. ② エンドユーザー権限管理 権限管理対象は、 ① IAM ② BigQuery データセット の 2

    つある ざっくり言えば、最大で 14 プロジェクト × 750 人 = 10,500 68 データセット × 750 人 = 51,000 これだけの権限を設定・管理する必要 そして、今後も増加する…
  22. ③ 連携元スキーマ変換 DDL 構文解析 & BigQuery JSON スキーマ定義変換 Python パッケージを開発

    CREATE TABLE Sample_Table ( ID integer PRIMARY KEY, NAME varchar(100) NOT NULL, TOTAL bigint NOT NULL, AVG decimal(5,1) NOT NULL, CREATED_AT date, UNIQUE (NAME) ); [ {"name": "ID", "type": "INTEGER", "mode": "REQUIRED"}, {"name": "NAME", "type": "STRING", "mode": "REQUIRED"}, {"name": "TOTAL", "type": "INTEGER", "mode": "REQUIRED"}, {"name": "AVG", "type": "FLOAT", "mode": "REQUIRED"}, {"name": "CREATED_AT", "type": "DATE", "mode": "NULLABLE"} ] DDL Parse Convert to BQ JSON https://github.com/shinichi-takii/ddlparse/ https://pypi.org/project/ddlparse/ PyPI
  23. ⑥ ロード機能が “エスケープ文字” 非対応 • BigQuery 読み込みジョブは、エスケープ文字に非対応 • Redshift UNLOAD

    ファイルと相性が悪い ◦ \”, \\, \t, \改行 (\n ではない) が解釈できない RFC 4180 (CSV仕様) には準拠
  24. ⑥ ロード機能が “エスケープ文字” 非対応 • BigQuery 読み込みジョブは、エスケープ文字に非対応 • Redshift UNLOAD

    ファイルと相性が悪い ◦ \”, \\, \t, \改行 (\n ではない) が解釈できない • Redshift UNLOAD ファイルのクレンジング処理を入れた RFC 4180 (CSV仕様) には準拠 ◦ \” ◦ \\ ◦ \t ◦ \改行 → ”” → \ → TAB char → LF char
  25. ⑥ ロード機能が “エスケープ文字” 非対応 • BigQuery 読み込みジョブは、エスケープ文字に非対応 • Redshift UNLOAD

    ファイルと相性が悪い ◦ \”, \\, \t, \改行 (\n ではない) が解釈できない • Redshift UNLOAD ファイルのクレンジング処理を入れた RFC 4180 (CSV仕様) には準拠 ◦ \” ◦ \\ ◦ \t ◦ \改行 → ”” → \ → TAB char → LF char 処理が重いのが悩みのタネ
  26. ⑧ テーブル作成の生産性 向上 : 従来 ① WebUI ② CLI :

    bq mk コマンド ~ ❯❯❯ bq mk \ --description "description" \ --schema "table_schema.json" \ --time_partitioning_field='sample_partition' \ --require_partition_filter=true \ project_id:dataset_id.table_name
  27. ⑧ テーブル作成の生産性 向上 : 新機能 DDL (Data Definition Language) Beta

    - Jan. 2018, GA - Jul. 2018 #standardSQL CREATE TABLE `project_id.dataset_id.table_name` (purchase_datetime TIMESTAMP, order_id STRING, amount INT64) PARTITION BY DATE(purchase_datetime) OPTIONS ( description = "description", require_partition_filter = true )
  28. まとめ • BigQuery は、フルマネージド で、 大量データを無限に集積できて、 最高性能を安価に 入手できるプラットフォーム • Google

    プロダクト連携 を考えれば、BigQuery 一択 • ロード処理がクエリ性能に影響を与えないので、 イベントドリブンでの大量データ連携 は非常に敷居が低い • 足りないものは 自らモジュール開発 することで、障壁をクリア