[小ネタ]dbtで実行順序が巡回するように開発すると何が起こるか #dbt

2022.07.01

さがらです。

小ネタなのですが、dbtで実行順序が巡回するように(つまりDAGとならないように)開発すると何が起こるか確かめてみました。

DAGとは

DAGとは「Directed Acyclic Graph」の略で、日本語に直すと「有向非巡回グラフ」となります。

以下、Wikipediaからの引用となります。Airflowなどで構築したワークフローは基本的にDAGになりますし、実際にDAGという用語が使われていますよね。

有向非巡回グラフ、有向非循環グラフ、有向無閉路グラフ(ゆうこうひじゅんかいグラフ、英: Directed acyclic graph, DAG)とは、グラフ理論における閉路のない有向グラフのことである。有向グラフは頂点と有向辺(方向を示す矢印付きの辺)からなり、辺は頂点同士をつなぐが、ある頂点vから出発し、辺をたどり、頂点vに戻ってこないのが有向非巡回グラフである

DAGや有向非巡回グラフと聞くと難しいですけども、データ基盤においては「順序付けする必要があるタスクの集合を図示したもの」という意味合いで使われることが多いと思います。

とても簡単な例ですが、

  • 「A➟B➟C」という実行順序:DAG
  • 「A➟B➟C➟Aにまた戻る」という巡回する実行順序:DAGでない

というイメージですね。

実行順序が巡回するようにdbtで開発するとどうなるか

DAG自体の説明は前述のとおりですが、実行順序が巡回するようにdbtで開発するとどうなるのか、確かめてみます。

前準備

とても簡単なmodelを3つ、定義しておきます。リネージとしては下図のようにしておきます。

この時、aaaがcccを参照するとどうなるのかを確かめてみます。

結論

ということで早速結論に入るのですが、Lineageがエラーとなりました!

「Found a cycle」ということで、「DAGじゃないよ~巡回しているよ~」と言われちゃってますね。

加えて、この状態でdbt runをしてみると、当たり前ですがエラーとなりました。エラーの内容は同じですね。

ということで、「実行順序が巡回するようにdbtで開発をすると、ちゃんとエラーを返してくれる」ことがわかりました。