今回の課題
dbtにてジョブを実行すると、実行する度に作成した全てのmodelに処理が走る。
実行する必要の無いmodelにも処理が走ってしまうため、クエリリソースを余分に多く消費してしまうという課題を感じていた。
dbtについての記事を読み漁っていたところ、
差分データが存在するモデルだけを実行するCIジョブの設定ができるということが分かったため、
その方法を試してみた。
※参考記事:dbt CloudにおけるCIについて
試してみた手順
手順1)本番デプロイ用のジョブを作成して一回実行しておく
こちらを実施することで、Artifactsが生成される。
ここで生成されたArtifactsと、この後の行程で生成するArtifactsの差分を確認して、
差分のあったモデルだけを実行するジョブを作成することができる。というイメージ。!
手順2)ジョブの編集画面を開く
手順3)Defer to previous run state?の設定
Defer to previous run state?
を、Self: [ジョブ名]([環境名])
に設定する。
これによって、手順1) にて生成したArtifactと、次回のジョブ実行時に生成されるArtifactの差分を確認できるようになる。
手順4)Commandsの設定
設定画面のCommands
に、--select state:modified+
を指定しておく。
こちらを実施することで下記が可能になる。
-
state:modified
により、Defer to previous run state?
で設定したジョブと差分があるmodelだけを実行対象とする - 末尾に
+
をつけることで、差分があったmodelより下流に位置するmodelも全て実行する。
以上で、差分のあるモデルだけが実行されるように設定ができた。
実際にジョブを実行してみた
まず、差分が無い状態でジョブを実行してみた
dbt buildのログの中に、下記の記述があった。
state:modified+
はどのノードにもマッチしません。とのことで、
差分データが無かったため、ジョブを実行してdbt build
が実行されたが、どのモデルにも処理が走らなかった様子。
2023-03-07 00:24:34.591773 (MainThread): 00:24:34 The selection criterion 'state:modified+' does not match any nodes
差分のデータを追加してジョブを実行してみた
特定のmodelのクエリにカラムを追加して、差分データを追加してみた結果、
そのmodelだけ実行されていた。
以上のような結果となり、無事差分データがあるモデルだけが実行されることを確認することができた。