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

広告配信におけるビッグデータ活用とそれを取り巻くシステム - Tech x Marketing...

Daiki Ishizuka
December 10, 2021
2.4k

広告配信におけるビッグデータ活用とそれを取り巻くシステム - Tech x Marketing - @issy/Zucks

Daiki Ishizuka

December 10, 2021
Tweet

Transcript

  1. 2 誰? 石塚 大貴 いしづか だいき CARTA HOLDINGS / Zucks

    将棋 精油 珈琲 ピアノ (いっしー) 趣味 フルサイクルエンジニア(3年目) データエンジニア(1年目) Profile
  2. 9 Zucks におけるデータ扱いの歴史 Zuck設立 2011 解析チーム発足 2016 BigQuery導入開始 2014 ビジネス成長

    データ活用用途の多様化 bqloader開発 2015 ※1 bqloaderの刷新 Looker の導入 2020 ~ 2021 ... 分析用re:dashを導入 2016 ※1 bqloader とは s3 に置いたファイルをBigQuery にロードして使えるようにする社内サービス
  3. 13 データ活用用途の多様化 2018 67種類 2019 144種類 2020 175種類 2021 186種類

    2017 44種類 ?? BigQuery に取り込みログの種類数の変化 ログの取り込み種類も大幅に増加
  4. 15 データサイエンス エンジニア データ分析 ロジック開発 アプリケーション エンジニア アラート監視 リリース後の 挙動チェック

    原因調査 ビジネスユーザー レポート データ活用用途の多様化 誰がどういう用途でデータを使う? 用途の 多様化
  5. 16 データ活用用途の多様化 誰がどういう用途でデータを使う? データサイエンス 74% re:dash 14% Looker 7% 他5%

    他5% クエリサイズ クエリ数 データサイエンス 42% re:dash 10% フラウド検知 バッチ 44% 機械学習 BIツール が大半を締めている
  6. データ量の増加 A B C D A B C データ種類の増加 D

    E F 17 データエンジニアリングの重要性が増加 複雑化 負荷増 2020年末くらいからデータエンジニアをやることに
  7. 配信サーバー バッチ 20 ETL編: 現bqloader s3 SQS log sns EC2

    Extract Transform ECS Load Google Storage BigQuery bqloader worker load batch システム構成
  8. 配信サーバー バッチ 21 システム構成 s3 SQS log sns EC2 Extract

    Transform ECS Recover recover batch ECS dedupe dedupe batch ECS Load Google Storage BigQuery bqloader worker load batch 差分 再取り込み 重複排除クエリ ETL編: 現bqloader
  9. 23 を使っている Workflow Engineとして bqloader load 起 点 機械学習 バッチ

    データ処理バッチ bqloader recover 機械学習 バッチ 機械学習 バッチ ETL編: 現bqloader
  10. 24 を使っている Workflow Engineとして bqloader load 起 点 機械学習 バッチ

    データ処理バッチ bqloader recover 機械学習 バッチ 機械学習 バッチ ETL編: 現bqloader
  11. 25 を使っている Workflow Engineとして bqloader load 起 点 機械学習 バッチ

    データ処理バッチ bqloader recover 機械学習 バッチ 機械学習 バッチ ETL編: 現bqloader
  12. qube load TARGET_DATETIME=2021-12-10T1415 qube load TARGET_DATETIME=2021-12-10T1430 qube load TARGET_DATETIME=2021-12-10T1445 qube

    load TARGET_DATETIME=2021-12-10T1500 qube load TARGET_DATETIME=2021-12-10T1515 qube load TARGET_DATETIME=2021-12-10T1530 27 障害が発生 復旧コマンド 14:00 15:00 14:30 15:30 14:15 15:15 14:45 15:45 OK OK ETL編: 現bqloader
  13. qube load TARGET_DATETIME=2021-12-10T1415 qube load TARGET_DATETIME=2021-12-10T1430 qube load TARGET_DATETIME=2021-12-10T1445 qube

    load TARGET_DATETIME=2021-12-10T1500 qube load TARGET_DATETIME=2021-12-10T1515 qube load TARGET_DATETIME=2021-12-10T1530 28 障害が発生 復旧コマンド 14:00 15:00 14:30 15:30 14:15 15:15 14:45 15:45 OK OK 復旧するのを簡単にしたい ETL編: 現bqloader
  14. 31 ETL編: 新bqloader 配信サーバー バッチ s3 SQS log SNS lambda

    Pub/Sub dataflow BigQuery recover Airflow dedupe Airflow 差分チ ェ ッ ク 再投入 重複排除 差分チェック 差分チェック 新システム構成図
  15. 36 ETL編: 新bqloader dataflow の苦悩: おもしろバグ watermark lagが 5,000w 余談:

    計算してみると、UNIX TIMESTAMP 0 (1970年) からの時間
  16. 37 ETL編: 新bqloader dataflow の苦悩: おもしろバグ class SomeDoFn extends DoFn<String,

    String> { private Counter counter = Metrics.counter(SomeDoFn.class, "my-counter"); @ProcessElement public void processElement(ProcessContext c) { counter.inc(); } } droppedDueToLatenessでcustom metrics を受けつけなくなる こんな感じで簡単にカスタムメトリクスが送れるのだが……
  17. 39 ETL編: 新bqloader dataflow の苦悩: オートスケールが攻め過ぎ Scaling up: If a

    streaming pipeline remains backlogged with workers utilizing, on average, more than 20% of their CPUs, for a couple minutes, Dataflow scales up. Dataflow targets clearing the backlog in approximately 150 seconds after scaling up, given the current throughput per worker. Scaling down: If a streaming pipeline backlog is lower than 10 seconds and workers are utilizing on average less than 75% of the CPUs for a period of a couple minutes, Dataflow scales down. After scaling down, workers utilize on average, 75% of their CPUs. In streaming jobs that do not use Streaming Engine, sometimes the 75% CPU utilization cannot be achieved due to disk distribution (each worker must have the same number of persistent disks), and a lower CPU utilization is used. For example, a job set to use a maximum of 100 workers (with 1 disk per worker) can be scaled down to 50 workers (with 2 disks per worker). For this job, a 75% CPU utilization is not achievable because the next scale down from 100 workers is 50 workers, which is less than the required 75 workers. Consequently, Dataflow does not scale down this job, resulting in a lower than 75% CPU utilization. No scaling: If there is no backlog but CPU usage is 75% or greater, the pipeline does not scale down. If there is backlog but CPU usage is less than 20% the pipeline does not scale up. https://cloud.google.com/dataflow/docs/guides/deploying-a-pipeline 自分でスケーリング条件を管理したい: 切実
  18. 42 ETL編: 新bqloader うまくいかなかった理由の考察 レコードの1カラムがでかすぎた Apache Beam の BigQueryIO.write の内部実装がイケてない

    dataflow のスケーリングの仕様が厳しすぎる ビジネスの特性の違い 普通にやってもうまくいかない 現状) これらを元に再設計してます
  19. 43 table_20211201 table_20211202 table_20211203 ... table_a table_b table_c ... table

    table ETL編: 新bqloader 新設計で良かった点もあります 日付別シャーディングテーブルをパーティションテーブルにする 同じ schemaのテーブルをまとめて差分をclustering field に切りだす select field from table_A union all select field from table_B union all select field from table_c select field from table SQLを書く時間の大幅短縮 クエリで 1,000 table_referencesの上限を超えなくなる
  20. 47 gcs ECS 学習・予測 データ加工 Data Science BigQuery s3 ECR

    task definition サーバー docker image push クエリ・データ保存 ログETL 保存 取得 アルゴリズム実行 parameter feature lambda CloudWatch Event (Schedule) 依存チェック 中間ファイル保存
  21. 54 BI Tools view: orders { dimension: id { primary_key:

    yes type: number sql: ${TABLE}.id ;; } dimension: order_amount { type: number value_format: “0.00” sql: ${TABLE}.amount ;; } measure: count { type: count } サンプルコード(一部抜粋) dimension view measure フィールド定義 型は何か? count percentile median XX_distinct sum average min max 表示フォーマットはどうするか? 実際にデータソースに投げるSQLは? etc... etc... 集計項目を定義 (aggregate) テーブル定義
  22. 55 BI Tools view: orders { dimension: id { primary_key:

    yes type: number sql: ${TABLE}.id ;; } dimension: order_amount { type: number value_format: “0.00” sql: ${TABLE}.amount ;; } measure: count { type: count } サンプルコード(一部抜粋)
  23. 56 BI Tools おすすめの始め方 一気に全てのテーブルを LookMLに書き起こそうとしない 大変だし、1巡目は書き方に困って、後々リファクタリングしたくなります 使われるところから書き起こそう(使われ始めると自然と要望が来るようになります) テーブル構造を使いやすい形に LookMLは万能ではありません。テーブル構造が汚ないとモデリングが大変です。

    例: 日付別シャーディングテーブルはどうやってモデリングするの?(スキャンサイズ落としたいんだが) 今までのものと併用して使う LookMLを定義していない場合には使えない (厳密にいうと使いづらい) SQLを扱える人にとっては、特殊な aggregation などは自分で書いた方が速い 新ETLがうまくいってから、もっと使いやすい形にしたい
  24. 57 興味をもたれた方へ Engineers in VOYAGE という本があります 第2章では、Zucksのエンジニア文化 第6章では、詳しく話せなかったデータサイエンスまわりの話 目次 第1章

    fluct:広告配信の舞台裏の技術者たち 第2章 Zucks:フルサイクル開発者の文化 第3章 VOYAGE MARKETING:20年級大規模レガシーシステムとの戦い 第4章 VOYAGE Lighthouse Studio:数十万記事のメディアをゼロから立ち上げる 第5章 サポーターズ:事業の成長を止めない手段としてのシステム刷新 第6章 データサイエンス:エンジニアによるビジネスのための機械学習 なんかもあります 手にとって読んでみてください いっしょに働く仲間を募集中! やりがいのある挑戦があなたをまっています!