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

私のdbt布教用資料 〜TROCCOUG Ver.〜 / My Guide to Evange...

yamamoto-yuta
September 14, 2024
780

私のdbt布教用資料 〜TROCCOUG Ver.〜 / My Guide to Evangelizing dbt - TROCCOUG Ver.

2024/09/13
#TROCCOUG 登壇資料
https://troccoug.connpass.com/event/326006/

yamamoto-yuta

September 14, 2024
Tweet

Transcript

  1. ヤプリの製品|Yappli 導⼊顧客向けにアナリティクスサービスを提供 CMS ダッシュボード Yappli 管理画⾯のトップに 表⽰されるダッシュボード Yappli Data Hub

    アプリ内の⾏動データや属性データを ユーザ単位で分析を可能にする データ連携サービス Yappli Analytics アプリログを網羅した分析や、 機能別に特化した分析が可能な ダッシュボード
  2. Yappli で提供している各機能がどの くらい使われているのか知りたい (定期的に) この前打ったプッシュ通知がどのく らい⾒られてるか知りたい (別のプッシュでもやってほしい) アンケートフォームの回答状況を知 りたい (仕組み化したい)

    要望 (データを元に意思決定したい) アプリログ サービスDB データ発⽣源 (データソース) データを抽出→加⼯して 要望に応える 増える要望 過去要望の アップデート 営業データ等
  3. Yappli で提供している各機能がどの くらい使われているのか知りたい (定期的に) この前打ったプッシュ通知がどのく らい⾒られてるか知りたい (別のプッシュでもやってほしい) アンケートフォームの回答状況を知 りたい (仕組み化したい)

    要望 (データを元に意思決定したい) アプリログ サービスDB データ発⽣源 (データソース) データを抽出→加⼯して 要望に応える どんどん つらくなる 過去要望の アップデート 増える要望 営業データ等
  4. 要望 (データを元に意思決定したい) アプリログ サービスDB データ発⽣源 (データソース) デ | タ 基

    盤 データを 抽出&蓄積 スケジュール クエリ Yappli で提供している各機能がどの くらい使われているのか知りたい (定期的に) この前打ったプッシュ通知がどのく らい⾒られてるか知りたい (別のプッシュでもやってほしい) アンケートフォームの回答状況を知 りたい (仕組み化したい) 増える要望 クエリを汎化 システム化 … データ基盤にデータを貯めて、 「抽出」と「加⼯」を 切り分けよう! 営業データ等
  5. 要望 (データを元に意思決定したい) アプリログ サービスDB データ発⽣源 (データソース) デ | タ 基

    盤 データを 抽出&蓄積 スケジュール クエリ Yappli で提供している各機能がどの くらい使われているのか知りたい (定期的に) この前打ったプッシュ通知がどのく らい⾒られてるか知りたい (別のプッシュでもやってほしい) アンケートフォームの回答状況を知 りたい (仕組み化したい) 増える要望 クエリを汎化 システム化 … この仕組みを整えるのが データエンジニアリング 営業データ等
  6. データエンジニアリングのライフサイクル 1. データエンジニアリングとヤプリにおけるdbtの⽴ち位置 ⽣成 (ソース) 取り込み 変換 提供 保存 機械学習

    リバースETL アナリティクス セキュリティ データ管理 DataOps データ アーキテクチャ オーケストレー ション ソフトウェア エンジニアリング 底流 出典:2. The Data Engineering Lifecycle - Fundamentals of Data Engineering
  7. データエンジニアリングのライフサイクル 1. データエンジニアリングとヤプリにおけるdbtの⽴ち位置 ⽣成 (ソース) 取り込み 変換 提供 保存 機械学習

    リバースETL アナリティクス セキュリティ データ管理 DataOps データ アーキテクチャ オーケストレー ション ソフトウェア エンジニアリング 底流 出典:2. The Data Engineering Lifecycle - Fundamentals of Data Engineering ソースからデータを 取り込むステップ 取り込み‧保存したデータを 変換するステップ 保存‧変換したデータを 各データ活⽤場所へ提供するステップ 取り込み‧変換したデータを 保存するステップ
  8. データエンジニアリングのライフサイクル 1. データエンジニアリングとヤプリにおけるdbtの⽴ち位置 ⽣成 (ソース) 取り込み 変換 提供 保存 機械学習

    リバースETL アナリティクス セキュリティ データ管理 DataOps データ アーキテクチャ オーケストレー ション ソフトウェア エンジニアリング 底流 出典:2. The Data Engineering Lifecycle - Fundamentals of Data Engineering このライフサイクルに当てはめて、 ヤプリにおけるdbtの⽴ち位置について話していきます
  9. ヤプリの場合(dbt導⼊前) 1. データエンジニアリングとヤプリにおけるdbtの⽴ち位置 - データエンジニアリングのライフサイクル ⽣成 取り込み 変換 提供 保存

    データ活⽤ 営業データ等 アプリログ サービスDB Dataflow TROCCO BigQuery CMSダッシュボード Yappli Data Hub 社内向け ダッシュボード等 Yappli Analytics サービスに影響が出るものは エンジニア側 がDataflowでカッチリ管理 分析要望に応えられるよう データサイエンス( DS)側がTROCCOで柔軟に管理
  10. ヤプリの場合(dbt導⼊前) 1. データエンジニアリングとヤプリにおけるdbtの⽴ち位置 - データエンジニアリングのライフサイクル ⽣成 取り込み 変換 提供 保存

    データ活⽤ 営業データ等 アプリログ サービスDB BigQuery CMSダッシュボード Yappli Data Hub 社内向け ダッシュボード等 Yappli Analytics Dataflow TROCCO ここがネック󰷺 サービスに影響が出るものは エンジニア側 がDataflowでカッチリ管理 分析要望に応えられるよう データサイエンス( DS)側がTROCCOで柔軟に管理
  11.   ←何がネックだったか この部分の責務はエンジニア側。しかし… • 集計した値が合ってるか?の確認はDS 側で実施する必要がありました ◦ エンジニア側で確認できるのは「この実装でサービスに不具合が出ないか?」 ➡ 集計結果に異常値があっても実装的には通ってしまう可能性が⾼い

    ◦ 集計した値の正誤判断までエンジニア側で⾏うのは(ドメイン知識の⾯などで)困難 ➡ 集計ロジック(SQL)の実装‧改修をDS側が基本的に担当 • 集計ロジックの実装に、集計とは直接関係ないサービス側の仕様が混⼊ ◦ 連番カラム等の追加、カラムの順番、 etc… 1. データエンジニアリングとヤプリにおけるdbtの⽴ち位置 - データエンジニアリングのライフサイクル エンジニア側とDS側の責務が曖昧…󰷺
  12. ヤプリの場合(dbt導⼊後) 1. データエンジニアリングとヤプリにおけるdbtの⽴ち位置 - データエンジニアリングのライフサイクル ⽣成 取り込み 変換 提供 保存

    データ活⽤ 営業データ等 アプリログ サービスDB Dataflow TROCCO BigQuery CMSダッシュボード Yappli Data Hub 社内向け ダッシュボード等 Yappli Analytics Dataflow dbt dbt を導⼊して、 「変換」を DS 側の管理下へ
  13. ヤプリの場合(dbt導⼊後) 1. データエンジニアリングとヤプリにおけるdbtの⽴ち位置 - データエンジニアリングのライフサイクル ⽣成 変換 保存 データ活⽤ 営業データ等

    アプリログ サービスDB Dataflow BigQuery CMSダッシュボード Yappli Data Hub 社内向け ダッシュボード等 Yappli Analytics Dataflow dbt データを取り込み・提供できているか?は エンジニア側 の責務 適切に変換できているか?は DS側の責務 取り込み 提供 TROCCO 責務が明確に💡
  14.      とは? • “Data Build Tool” の頭⽂字を取って”dbt” • データの「変換処理」を良い感じに管理できるツール •

    dbt Labs 社が開発 ◦ dbt Core (無償CLI、OSS) ←ヤプリはこちらを利⽤ ▪ pip install でインストールできます ◦ dbt Cloud (有償SaaS) 以降の話はdbt Core中⼼に進めていきます 2. 「dbt」とは? 変換
  15. 近年のdbtの導⼊状況 2. 「dbt」とは? 今、データ界隈で急速に浸透しているモダンなツール DL数が近年急増 dbt Core/dbt Cloud導⼊企業: • デジタル庁

    • 株式会社CARTA HOLDINGS • 株式会社LayerX • 株式会社10X • Sansan株式会社 • 株式会社タイミー • ピクシブ株式会社 • 株式会社kubell • etc. 導⼊企業も続々増加
  16. 1. ソフトウェアエンジニアリングの叡智が使える 2. 「dbt」とは? - dbtを導⼊すると何が嬉しいのか? 処理の共通化‧再利⽤ dbt macroによく使う集計‧加⼯ロジック (SQL)を書くことで共通化&再利⽤可能化

    チーム開発体制の構築 dbtでは集計‧加⼯SQLファイルを Git管理 CI/CDの利⽤ ファイルをGit管理 || CI/CDを取り⼊れやすい 出典: 【図解】git-flow、GitHub Flowを開発現場で使い始めるためにこれだけは覚えておこう 出典: DevOps(開発‧運⽤環境)|Sky株式会社 データの加⼯処理が 実装‧メンテしやすくなる ソフトウェア開発でのブランチ戦略や チーム開発のノウハウ等が流⽤できる テスト、ドキュメント⽣成などの ⾃動化が容易に
  17. 2. 「dbt」とは? - dbtを導⼊すると何が嬉しいのか? 1. ソフトウェアエンジニアリングの叡智が使える ヤプリのデータ加⼯の流れ(dbt導⼊前) BigQueryにある 元データのテーブル SQLで書かれた

    加⼯処理 データマート テーブル データを抽出 加⼯結果を出⼒ 可視化 Looker Studio等 ここを開発するには… 1. BigQuery でクエリを作成 2. ⼿動で本番反映 • レビューのステップを踏むのが⼤変…😓 • 本番反映の⼈為ミス発⽣のリスク😱 • 作業分担が困難…😭 ➡ 危険‧属⼈性が⾼い
  18. 2. 「dbt」とは? - dbtを導⼊すると何が嬉しいのか? 1. ソフトウェアエンジニアリングの叡智が使える ヤプリのデータ加⼯の流れ(dbt導⼊後) BigQueryにある 元データのテーブル データマート

    テーブル データを抽出 加⼯結果を出⼒ 可視化 Looker Studio等 dbtで実装した 加⼯処理 ワークフロー デプロイ ここを開発するには… 1. ローカルで実装 2. Pull Request 3. mainブランチへmerge 4. TROCCOへ⾃動反映 • レビューのステップを踏みやすい • ⾃動反映で本番環境での⼈為ミスが起きない • 作業分担が可能 ➡ 安全‧チーム開発が容易に
  19. 2. データカタログ機能が標準で付いている データカタログとは? • 組織内のデータ資産についてまとまっている⽬録※1 ◦ 「図書館の蔵書検索システムみたいなもの※2」 • データカタログを⾒れば… ◦

    どこに? ◦ どんなデータが? ◦ どんな構造(カラム等)で? ◦ データの更新⽅法(洗替/追記)は? ◦ etc… 2. 「dbt」とは? - dbtを導⼊すると何が嬉しいのか? すぐ分かる! ※1 出典:What Is a Data Catalog and Why Do You Need One? ※2 「Data Engineering Study #25 データカタログの現在地」のDATUM STUDIO川⼝さんの例えが分かりやすかったので拝借させていただきました🙏
  20. 2. データカタログ機能が標準で付いている 2. 「dbt」とは? - dbtを導⼊すると何が嬉しいのか? SELECT id AS order_id,

    user_id AS customer_id, order_date, status FROM {{ source(“dbt_src_test”, “raw_orders”) }} SELECT id AS customer_id, first_name, last_name FROM {{ source(“dbt_src_test”, “raw_customers”) }} stg_orders.sql stg_customers.sql dbt では SELECT~FROM 句が書かれた SQL ファイルでテーブルを定義
  21. 2. データカタログ機能が標準で付いている 2. 「dbt」とは? - dbtを導⼊すると何が嬉しいのか? SELECT id AS order_id,

    user_id AS customer_id, order_date, status FROM {{ source(“dbt_src_test”, “raw_orders”) }} SELECT id AS customer_id, first_name, last_name FROM {{ source(“dbt_src_test”, “raw_customers”) }} stg_orders.sql stg_customers.sql テーブル定義ファイルからデータカタログ( dbt docs )を⾃動作成
  22. 2. データカタログ機能が標準で付いている 2. 「dbt」とは? - dbtを導⼊すると何が嬉しいのか? SELECT id AS order_id,

    user_id AS customer_id, order_date, status FROM {{ source(“dbt_src_test”, “raw_orders”) }} SELECT id AS customer_id, first_name, last_name FROM {{ source(“dbt_src_test”, “raw_customers”) }} stg_orders.sql stg_customers.sql テーブル定義ファイルからデータカタログ( dbt docs )を⾃動作成 カンタン&すぐに データカタログを始められる!
  23. 2. データカタログ機能が標準で付いている 2. 「dbt」とは? - dbtを導⼊すると何が嬉しいのか? version: 2 models: -

    name: stg_orders description: | オーダー情報。Staging層。カラム名の是正などを行なっている。 columns: - name: order_id description: "オーダーID" - name: customer_id description: "顧客ID" - name: order_date description: "注文日" schema.yml YAMLファイルでテーブルやカラムの説明などを補⾜可能
  24. 3. データの加⼯過程を可視化できる 2. 「dbt」とは? - dbtを導⼊すると何が嬉しいのか? 営業データ等 アプリログ サービスDB BigQuery

    CMSダッシュボード Yappli Data Hub 社内向け ダッシュボード等 Yappli Analytics データはデータソースから様々な テーブルを経て各データ活用場所へ
  25. 3. データの加⼯過程を可視化できる 2. 「dbt」とは? - dbtを導⼊すると何が嬉しいのか? dbt docsでは… データソース (BigQuery)

    ←上流 データソースから各テーブルがどのような過程で作成されているかが分かる (データリネージが確認できる) 下流→
  26. 3. データの加⼯過程を可視化できる 2. 「dbt」とは? - dbtを導⼊すると何が嬉しいのか? データソース (BigQuery) ←上流 下流→

    データソースから各テーブルがどのような過程で作成されているかが分かる (データリネージが確認できる) ▼ 各集計ロジックの影響範囲が分かる ここの SQL を 変えると… ここ以降に影響が 出る可能性アリ dbt docsでは…
  27. 4. データのテストがやりやすい 「データのテスト」とは? • 値のテスト ◦ すでに貯まっているデータが仕様通りになっているかをチェックするテスト ◦ 例) ▪

    この “id” ってカラム、 NOT NULL のはずだけど本当にそうなってる? ▪ この “type” ってカラム、 “iOS” か “Android” の2種類の値しか⼊らないはずだけど本当にそうなってる? ▪ etc… • ロジックのテスト ◦ 実装した集計‧加⼯ロジックが期待通りかをチェックするテスト(=単体テスト) ◦ 例) ▪ こういうパターンのE-mailアドレスが来た時にこの正規表現でちゃんと拾えてる? 2. 「dbt」とは? - dbtを導⼊すると何が嬉しいのか?
  28. 4. データのテストがやりやすい データのテストができると何が嬉しい? • 異常なデータが⼊ってきた時に検知できる • ヤプリの場合、Yappli Data Hub経由でアプリユーザの⾏動ログが⼊ってくる → ⾏動ログまわりのインシデントの早期検知に役⽴っている

    • 実際に書いてるテスト: ◦ iOS/Androidで数倍以上レコード数に差があるアプリが存在していないか? ◦ 末尾に指定した⽂字列が含まれているか? ◦ NULLが含まれていないか? ◦ etc. 2. 「dbt」とは? - dbtを導⼊すると何が嬉しいのか?
  29. 4. データのテストがやりやすい なぜdbtだとデータのテストがやりやすい? • テストを実装しやすい仕組みが⽤意されているから • 値のテスト ◦ Generic Test

    ◦ Singular Test • ロジックのテスト ◦ Unit Test ←v1.8で新たに追加 2. 「dbt」とは? - dbtを導⼊すると何が嬉しいのか?
  30. 4. データのテストがやりやすい なぜdbtだとデータのテストがやりやすい? 値のテスト: • Generic Test … ⽤意されているテスト群を使って⾏うテスト ◦

    dbt標準でunique, not_null, accepted_values, relationship の4種類が⽤意されている ◦ YAMLファイルでどのテーブル‧カラムにどのテストを適⽤するかを指定する ◦ 【特徴】⼀般的でよくあるテストがしやすい ▪ 例)テーブル ”hoge” のカラム “id” に NULL が含まれていないか? • Singular Test … 存在し得ないデータを出すクエリを書いて⾏うテスト ◦ 【特徴】ドメインや状況などに特化したテストができる ▪ 例)iOS/Androidで数倍以上レコード数に差があるアプリが存在していないか? 2. 「dbt」とは? - dbtを導⼊すると何が嬉しいのか?
  31. 4. データのテストがやりやすい なぜdbtだとデータのテストがやりやすい? ロジックのテスト(Unit Test): 2. 「dbt」とは? - dbtを導⼊すると何が嬉しいのか? SELECT

    id, email, REGEXP_CONTAINS( email, r'^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}$' ) AS is_valid_email_address, FROM {{ source('tmp_study_dbt_yamamoto', 'raw_users') }} stg_users.sql unit_tests: - name: test_is_valid_email_address model: stg_users given: - input: source('tmp_study_dbt_yamamoto', 'raw_users') rows: - {id: 1, email: '[email protected]'} - {id: 2, email: 'fuga'} - {id: 3, email: NULL} expect: rows: - {id: 1, email: '[email protected]', is_valid_email_address: TRUE} - {id: 2, email: 'fuga', is_valid_email_address: FALSE} - {id: 3, email: NULL, is_valid_email_address: NULL} _schema.yml 参考: dbt v1.8で追加された単体テストを触ってみた - Speaker Deck ⼊⼒値 期待する 出⼒値
  32. dbt実⾏⽤TROCCOワークフロー 3. ヤプリでのTROCCO×dbt活⽤事例 - dbt実⾏のオーケストレーション 共通データマート作成⽤ dbt runジョブ CMSダッシュボード⽤ dbt

    runジョブ① Yappli Analytics⽤dbt runジョブ CMSダッシュボード⽤dbt run ワークフロー(リトライ⽤) Yappli Analytics⽤データセット への移動⽤ワークフロー ベータ版機能⽤ データマート作成ワークフロー 共通データマートの作成 各サービス⽤データマートの作成
  33. 共通データマート作成⽤ dbt runジョブ CMSダッシュボード⽤ dbt runジョブ① Yappli Analytics⽤dbt runジョブ CMSダッシュボード⽤dbt

    run ワークフロー(リトライ⽤) Yappli Analytics⽤データセット への移動⽤ワークフロー ベータ版機能⽤ データマート作成ワークフロー dbt実⾏⽤TROCCOワークフロー 3. ヤプリでのTROCCO×dbt活⽤事例 - dbt実⾏のオーケストレーション 要件が変わりうるものは 固まるまでTROCCOで加⼯して 柔軟に対応 共通データマートの作成 各サービス⽤データマートの作成
  34. 共通データマート作成⽤ dbt runジョブ CMSダッシュボード⽤ dbt runジョブ① Yappli Analytics⽤dbt runジョブ CMSダッシュボード⽤dbt

    run ワークフロー(リトライ⽤) Yappli Analytics⽤データセット への移動⽤ジョブ ベータ版機能⽤ データマート作成ワークフロー dbt実⾏⽤TROCCOワークフロー 3. ヤプリでのTROCCO×dbt活⽤事例 - dbt実⾏のオーケストレーション CMSダッシュボード⽤ dbt runジョブ② 実⾏が不安定なdbtモデル※があったので ジョブを切り出してリトライするよう対応 (リトライにはTROCCOワークフローのリトライ機能を利⽤) ※ 稀に実⾏に異常に時間がかかってタイムアウトしてしまうことがある 共通データマートの作成 各サービス⽤データマートの作成
  35. 本⽇お伝えした内容 • さらにデータを活⽤していくために必要に なってくるのが「データエンジニアリング」 • dbtはデータの「変換処理」を 良い感じに管理できるツール • dbtを導⼊すると嬉しいこと: ◦

    ソフトウェアエンジニアリングの叡智が使える ◦ データカタログ機能が標準で付いている ◦ データの加⼯過程を可視化できる ◦ データの品質テストがやりやすい 4. まとめ 変換