dbtコマンドの差分実行

Prev Next

概要

dbtコマンドの差分実行は、過去のdbtジョブで生成された成果物(manifest.json、run_results.json)と比較して、変更のあったモデルや前回失敗したモデルのみを選択的に実行する機能です。
大規模なdbtプロジェクトにおいて、コマンドの実行時間を短縮できます。

差分実行は、dbtのstateメソッドの仕組みを利用しています。
詳しくは、dbt公式ドキュメント - The "state" methodを参照ください。
TROCCOでは、dbtジョブの実行ごとに成果物を自動的に保存・取得するため、ユーザーが成果物を手動で管理する必要はありません。

利用可能なセレクタ

差分実行を利用する場合は、dbtジョブ設定のコマンドオプションで以下のセレクタを指定します。
デフォルトではセレクタは指定されておらず、差分実行は行われません。

セレクタ 説明 コマンドオプションの設定例
state:modified 前回成功した実行から変更されたモデルのみを実行します。dbtプロジェクト内のモデルに変更を加えた際に、変更箇所だけを効率的に実行できます。 --select state:modified
result:error 直前の実行で失敗したモデルのみを再実行します。コマンド実行が部分的に失敗した場合に、失敗箇所だけを再実行できます。 --select result:error

対象コマンド

差分実行の対象のコマンドは以下のとおりです。
対象コマンドには、自動的に--stateフラグが付与されます。

  • dbt build
  • dbt run
  • dbt seed
  • dbt snapshot
  • dbt source freshness
  • dbt test

dbt depsとdbt run-operationは、差分実行の対象外です。

注意事項

差分実行が行われない場合(フォールバック)

以下の条件に該当する場合、TROCCOは--stateフラグを付与しません。
state:modifiedやresult:errorなどのセレクタを指定している場合、dbtがエラーを返すことがあります。

  • 初回実行時など、前回の成果物が存在しない場合
  • 前回のアップロードが不完全だった場合など、成果物の整合性に問題がある場合
  • 前回の実行時とdbtバージョンが異なる場合
  • 成果物のダウンロードに失敗した場合
同一ジョブ定義の並行実行

同一のdbtジョブ定義を並行して実行した場合、成果物の整合性チェックによりフォールバックされることがあります。
ジョブの実行結果に影響はありませんが、差分実行の効果が得られない場合があります。

state:modifiedで検出されない変更

state:modifiedセレクタは、dbtの成果物(manifest.json)に記録される情報に基づいて変更を検出します。
以下の変更はmanifest.jsonに記録されないため、state:modifiedでは検出されません。

  • 環境変数やランタイム変数の変更
  • 外部テーブルのスキーマ変更(コード変更を伴わない場合)
  • データウェアハウス側での手動によるテーブル変更・削除
  • 1MiB以上のseedファイルの内容変更(パスの比較のみが行われるため)

これらの変更を反映するには、セレクタを指定せずにすべてのモデルに対してコマンドを実行してください。