2023/03/28、dbt Meetup dbt ユーザー会で発表した、森田の資料になります。
© Recruit Co., Ltd. All Rights Reserved2年運用した dbt プロジェクトをリファクタリングする株式会社リクルート データ推進室 D3M 部森田 順也2023/03/28
View Slide
© Recruit Co., Ltd. All Rights Reserved自己紹介森田 順也 (もりた じゅんや) @jjjjj_knデータ推進室 データテクノロジーユニット D3M 部 アナリティクスエンジニアSIerにてデータ異常検知の研究開発に携わった後、2019年にリクルートへ入社。アナリティクスエンジニアとして分析基盤の開発に従事。 datasaber。Podcasthttps://open.spotify.com/show/6Xc6jNS2p1UqjnPppwO80V?si=WXCP2O58RrePvsjTMomtIwZennhttps://zenn.dev/mjunya10302#recruitdata
© Recruit Co., Ltd. All Rights Reserved本日お話しすることカーセンサーでは、2020年にdbtの検証を始め、導入して2年以上が経っています。長期間運用する中で、分析のスピードをとにかく早めるため試行錯誤を重ねてきました。本日はこの試行錯誤の一つである、リファクタリングの推進を深ぼってお伝えしたいと思います。3
© Recruit Co., Ltd. All Rights Reserved4ご存知でしょうかカーセンサー実は、単なる中古車情報サイトではないんです
© Recruit Co., Ltd. All Rights ReservedCASE: 自動車業界は100年に一度の大変革時台5ConnectedAutonomousShared & ServicesElectrificationコネクティッド自動化シェアリング電動化
© Recruit Co., Ltd. All Rights Reservedクルマの利用シーンを包括的に支援するプラットフォームへ6新車買いたい中古車買いたい新車リースしたい中古車リースしたい借りたいカスタマー クライアントMissionクライアントの商いを拡げ、それによって、ユーザーの選択肢を拡げる。
© Recruit Co., Ltd. All Rights Reserved私たちのMission: あらゆる業務をデータで牽引すること7カーディーラー様に売れ筋の車種を提案したい!新規事業で追うべき KPIを見つけたい!集客の効果・コストをモニタリングしたい!営業 企画 マーケティング提案にそのまま持っていけるBIツールを提供さまざまな軸でドリルダウンできるデータソースを提供数値定義を統一したKPIダッシュボードを提供さまざまな分析ニーズに対応する必要がある
© Recruit Co., Ltd. All Rights Reservedリファクタリングが必要になった経緯8
© Recruit Co., Ltd. All Rights Reserved分析サイクルのスピードはビジネスによってさまざま9分析サイクル課題設定→ログ設計→データ収集→分析→行動...ref. adobeSLOW: 集客効果のモニタリング月次、年次で統一されたKPIを定常的に振り返るFAST: 新機能の初速分析毎週のように課題発見、打ち手実施を行い、NorthStar となる指標を変えながら振り返るサイクルの早い分析にどう対応するか?
© Recruit Co., Ltd. All Rights Reservedadhoc レイヤーの導入10生成されるモデルが全て view であり、更新jobが不要 で、モデリングルールを無視でき、通常の開発フローから切り出してリリースできるレイヤーSource Staging Mart ReportingAdhoc
© Recruit Co., Ltd. All Rights Reserved開発着手Pull RequrestMain MergeTagadhoc レイヤーの導入11生成されるモデルが全て view であり、更新jobが不要 で、モデリングルールを無視でき、通常の開発フローから切り出してリリースできるレイヤーnon-adhoc adhocdbt SQL設計・実装 dbt SQL設計・実装dbt JOB設計・実装開発環境デプロイ開発環境デプロイ開発JOBの実行・テーブル生成開発デプロイ前レビュー本番デプロイ前レビュー開発環境データテスト開発環境データテスト本番デプロイ前レビュー本番環境デプロイ本番環境デプロイ本番JOBの実行・テーブル生成本番環境データテスト/Doc生成本番環境データテスト/Doc生成開発フロー● テスト● ドキュメンテーション● レビュー上記全て行いつつリリースまでの工程を短縮保守性を犠牲にスピードを獲得
© Recruit Co., Ltd. All Rights Reservedadhoc レイヤーのクエリはリファクタリング前提12dbtを使ったクエリのリファクタリングについてご紹介します本日のメインテーマ!
© Recruit Co., Ltd. All Rights Reservedデータパイプライン開発のリファクタリングとは何か13
© Recruit Co., Ltd. All Rights ReservedYou Ain’t Gonna Need It14「こんなこともあろうかと」と思って作ったテーブルは大抵使われない。先に仕様を満たすテーブルをリリースし、後から保守しやすい形に変えるほうが価値を最大化できる。Source Staging MartAdhocAdhocAdhocSource Staging MartreportingreportingreportingSourceAdhocAdhocAdhocSource Staging Mart保守しやすい形とは?
© Recruit Co., Ltd. All Rights Reserved保守しやすいデータパイプラインは永遠のテーマ15パイプライン開発の課題を解く方法はたくさんある都度設計について議論・設計していてはリファクタリングが進まないUU数算出の計算が多数のクエリで登場している思わぬところでBIツールやJobから参照されている加工・結合が乱立していて処理を読み解きにくいデータパイプラインにもデザインパターンが欲しいテーブルを分ける?クエリにコメントを書く?マクロでまとめる?中間テーブルにする?不用意な参照を禁止?リネージをメタ情報に記載?
© Recruit Co., Ltd. All Rights Reservedモデリング:データパイプライン開発のデザインパターン16Source Staging Mart Reportingデータパイプラインのリファクタリングとは、モデリングのルールを作り、クエリをルールに寄せていくことSourceAdhoc一次加工的な処理複数のCTEの結合処理BIレポート用に集計する処理
© Recruit Co., Ltd. All Rights Reservedカーセンサーで導入したモデリングのルール17Source Staging Mart Reporting1要件:1テーブルとし、要件外から参照させないユーザーごとの粒度に揃え、ユーザーに関する分析はこのテーブルを必ず使う元のデータの単純変換のみとし、Join等を行わない。参照先テーブルを限定させて不具合時の影響範囲を絞るSSoTとして機能させ、指標の定義ズレをなくす1次加工とドメインに依存するロジックを分離し、見通しをよくするルール目的事例紹介このルールに寄せれば “ある程度” リファクタリング可能
© Recruit Co., Ltd. All Rights Reserved“良い” リファクタリングとは18
© Recruit Co., Ltd. All Rights Reserved不吉な匂いから課題を見つける19解決したい課題を言語化し、既存のモデリングルールを適用して課題が解けそうか確認し、解けなければルール自体を見直す。不吉な匂い500行を超えるような長大なクエリがある全く同じ加工処理がある(CASE文、CAST等)粒度が同じテーブルがある特定の用途で作られたテーブルが、意図しないテーブルから参照されている課題クエリを保守できる人が限定されてしまい改修が進みにくくなっていないか?ロジック変更時に修正する箇所が多く、抜け漏れを起こしていないか?どちらのテーブルを参照すべきか判断がつかなくなっていないか?テーブルを修正したら思わぬ場所に影響が出てしまいデグレを起こしていないか?
© Recruit Co., Ltd. All Rights Reservedドメイン知識を貯める20分析時のコンテキスト=ドメイン知識に応じて最適なモデリングは変わる売上など財務に関する分析が多い営業組織単位で分析することが多い売り上げは顧客毎に計上している 営業組織は顧客毎に組閣している顧客で一意になるテーブルがあれば、両方の分析ニーズを満たすことができる経営企画室 営業部リファクタリング案分析の傾向ドメイン知識
© Recruit Co., Ltd. All Rights Reservedドメイン知識をディメンショナルモデリングに応用21ファクト=粒度を導出する ディメンション=属性を導出する事例紹介年月と車台番号の粒度でデータを持たせておく複数の属性から導けるボディタイプという属性を作っておき、不要な属性を減らすカーディーラー様が、カーセンサーの掲載効果を月次でチェックしている車は、ボディタイプによって人気や売れる地域が大きく変わる年月と車台番号に関する分析が多い ボディタイプでフィルタする分析が多い分析の傾向ドメイン知識リファクタリング案
© Recruit Co., Ltd. All Rights Reservedリファクタリングをやり切るには22
© Recruit Co., Ltd. All Rights Reserved振る舞いを変えず、内部処理を変える23Source@prd AdhocStaging Mart Adhocリファクタリング前リファクタリング後 Source振る舞い最終的なテーブルのデータが変わってない内部処理中間テーブルが増えている振る舞いを定義して、テストすることがゴール
© Recruit Co., Ltd. All Rights Reserved外部に公開・提供しているテーブルを振る舞いとする24Source Staging MartadhocReportingEphemeral営業部UI/UXチーム経営企画室振る舞い内部処理※レイヤーと 内部処理/振る舞い がある程度対応するモデリングルールのほうが扱いやすいことが多い
© Recruit Co., Ltd. All Rights ReservedExposureを用いて振る舞いとなるテーブルを管理25事例紹介
© Recruit Co., Ltd. All Rights Reserved振る舞いをテストする26テーブルの一意性が崩れていないかに加え、変更前後で完全合致するかを確認するスキーマテストリファクタリング前後で、テーブルの一意性・参照整合性が変わってないことをテストする。- unique結合処理を書き換えるとレコードの重複が起こりやすいため、uniqueテストで検知する- not_null抽出・結合処理を書き換えるとデータの欠損が起こりやすいため、not_nullテストで検知する- relation抽出・結合処理を書き換えるとデータの欠損が起こりやすいため、参照整合を保てているかで検知する完全合致テストリファクタリング前後で、データが一切変わっていないことをテストする。ただし、環境の違いによってデータが変わるため、下記のようにテストコードを用意しておく。- カラムの除外・指定タイムスタンプなど、テーブル生成時刻で値の変わるカラムを除外できるテストコードを用意する- 抽出条件の指定最新断面同士の比較など、比較対象を限定できるようテストコードを用意する
© Recruit Co., Ltd. All Rights Reserved完全合致テストの自動化27$ dbt build -s is_same --vars \'{target_table: "sample_table", except_columns: "column1,column2", where_condition: column3="HOGE"}'14:48:01 Running with dbt=1.2.114:48:01 Unable to do partial parsing because config vars, config profile, or config target have changed14:48:04 Found 132 models, 577 tests, 0 snapshots, 0 analyses, 739 macros, 0 operations, 2 seed files, 138 sources, 24exposures, 0 metrics14:48:0414:48:11 Concurrency: 4 threads (target='dev')14:48:1114:48:11 1 of 1 START table model dsu_treasure_data.is_same ............................. [RUN]14:48:14 1 of 1 OK created table model dsu_treasure_data.is_same ........................ [CREATE TABLE (0.0 rows, 1.1 MB processed) in3.21s]14:48:1414:48:14 Finished running 1 table model in 0 hours 0 minutes and 9.75 seconds (9.75s).14:48:1414:48:14 Completed successfully14:48:1414:48:14 Done. PASS=1 WARN=0 ERROR=0 SKIP=0 TOTAL=1※実際のところ、このコマンドはエラー時の解析が手間なので、コンパイルしたSQLの方がよく使われた事例紹介開発環境のデータと本番環境のデータが合致するのかをワンライナーで自動チェック
© Recruit Co., Ltd. All Rights Reserved終わりに28
© Recruit Co., Ltd. All Rights Reservedリファクタリングと dbt の持つ魅力29事前に将来の分析ニーズを把握し、汎用的なデータマートを用意することは難しい。アドホックなクエリを許容しつつ、ドメイン知識を吸収してリファクタリングを進めるほうが、分析アウトプットも多く出せて、良いモデリングに近づける。dbt は、リファクタリングを積極的に行える状態を作るのに最適- モデリングルールの適用- 振る舞いの定義- データのテスト
© Recruit Co., Ltd. All Rights Reservedカーセンサーには、モダンな分析環境、大規模なデータ、チャレンジングな課題が揃っています。アナリティクスエンジニアリングを駆使して一緒にビジネスを Drive して行く人を、お待ちしています!30
© Recruit Co., Ltd. All Rights Reserved<参考>dbt-project-evaluator31dbt-project-evaluator という dbt project の良し悪しを判断する package も存在する。https://docs.getdbt.com/blog/align-with-dbt-project-evaluator$ dbt build --select package:dbt_project_evaluator,+fct_model_fanout{{略}}04:31:40 Completed with 1 warning:04:31:4004:31:40 Warning in test is_empty_fct_model_fanout_ (models/marts/dag/dag.yml)04:31:40 Got 8 results, configured to warn if != 004:31:4004:31:40 compiled SQL attarget/compiled/dbt_project_evaluator/models/marts/dag/dag.yml/is_empty_fct_model_fanout_.sql04:31:4004:31:40 Done. PASS=14 WARN=1 ERROR=0 SKIP=0 TOTAL=15← 参照されているモデルを洗い出し、閾値(=5)以上の数が紐づいていたらアラートしてくれる