📑

複数のdbtプロジェクトをdbt docsでまとめようとした話

2023/12/23に公開

この記事は、dbt Advent Calendar 2023 24日目の記事です。

概要

私が所属するチームでは導入の敷居を下げるために1データソースに1dbtプロジェクトという構成になっています。そのため、dbt docsでドキュメントを作成した場合、データソースごとにdbt docsでWebサイトを立ち上げる必要があり、とても業務に使えるものではありませんでした。
dbt Cloudであれば、coalesce 2023で発表されたdbt Meshを使って複数のプロジェクトを統合できるようですが、会社の都合上クラウドサービスを使うのは難易度が高いため、dbt docsでどうにかできないか検討し、以下の2点から実運用には耐えられないとの結論でした。

  • dbt packageの依存関係解決
  • マスター系データの重複作成


図1:アーキテクチャ構成

検証内容

コンセプト

概要の内容ができないかと思ったのはdbtのパッケージで自分のプロジェクトを参照できるという点でした。
https://docs.getdbt.com/docs/build/packages#how-do-i-add-a-package-to-my-project

これらシステムごとに作成したdbtプロジェクトをまとめて一つのdbt docsを作成することで、dbtで作成したデータを一元管理できるのではないかと考えました。コンセプトは図2の通りです。


図2:検証コンセプト

検証内容

2つのプロジェクトを作成して問題なくdbt docsが作成され、作成されたドキュメントが利用可能であるかを確認しました。
(実際には実プロジェクトのコードで確認しており、その検証結果の事象を再現するようにサンプルプロジェクトを作成しました。)

dbtではgitリポジトリを次のように記述することで、自身のプロジェクトを参照できます。

packages:
  - git: "https://github.com/shin1103/dbtdocs-sample-system-a.git"
    subdirectory: "systemA" # gitリポジトリ上のディレクトリを指定可能
    revision: "main" # gitのブランチ
  - git: "https://github.com/shin1103/dbtdocs-sample-system-a.git"
    subdirectory: "systemB"
    revision: "main"

上記設定をしてドキュメントを生成したのですが、概要にもある通り2つの点でうまくいきませんでした。

dbt packageの依存関係解決

繰り返しになりますが、私のチームではシステムごとにdbtのプロジェクトを作成していました。dbt_utilsに代表されるパッケージについては都度最新のパッケージを使うルールにしていました。そのためsystemAではバージョン1.0、systemBではバージョン1.1のようになっています。そのため、依存関係でエラーが起きます。

08:49:45  Encountered an error:
Version error for package dbt-labs/dbt_utils: Could not find a satisfactory version from options: ['=1.0.0', '=1.1.0']

解消する案としてdbt_utilsのバージョン指定を"1.0.0"から">=1.0.0"にする方法はあるが、依存関係のあるパッケージの破壊的変更発生時にどこまで対応できるのか不明なので、将来的には予期せぬ不具合を起こしかねないと思いました。

マスター系データの重複作成

個別システムのデータソースは基本的に重複することはないのですが、マスター系のデータについてはシステム横断で参照するため、複数のシステムから参照されています。
その場合、dbtでは同一のものをしてマージしてくれることはなく、別々のデータソースと認識するのでdbt docsでドキュメントを作成した際に同じデータソースでも別々のものとして認識されてしまいます。


図3:重複のスクリーンショット

マスター系データを定義するsource yamlをもったdbtプロジェクトを作成して、各システムのプロジェクトがそれを参照すれば解消できそうですが、dbt docsを作成するために実開発でプロジェクト間の依存関係を持たせるのは辛そうだなという印象です。

検証結果

dbt packageのgitリポジトリ参照機能を用いてdbt docsを統合することは厳しそうです。

追記

先日dbt labsより案内があったHow to get value from dbt Meshというオンラインセミナーに参加しました。(別の打ち合わせがあったので、音声なしのスライドだけ見てました。現在はオンデマンド配信になっているので登録すれば視聴可能なようです。)
その中で、dbt Mesh前のプロジェクト統合パターンのケース3として今回のケースが紹介されていました。dbt labsはこのパターンを認識しており、dbt Meshを推奨していました。

Discussion