データパイプラインにおけるDAGとは?有向非巡回グラフを解説
DAG(有向非巡回グラフ)は、pipelineを循環のない依存関係で接続されたtaskとしてモデル化し、orchestratorがそれらをどの順番で実行するかを把握できるようにします。
DAGは、あらゆる非自明なpipelineに対するデータエンジニアのメンタルモデルです。どのステップがどの他のステップに依存するかを、1つのルール - 循環なし - とともに捉えます。この単一の制約により、taskを実行する有効な順序が常に存在し、pipelineが終了することが保証されます。
DAGとは何か
DAGは、有向エッジ(依存関係)で接続されたノード(task)のグラフで、出発点に戻るパスがないものです。データpipelineでは、taskAからtaskBへのエッジは、AB が完了するまで開始できないことを意味します。非巡回という性質が、有効な実行順序が存在することを保証します。
なぜpipelineはDAGを使うか
pipelineは依存関係に満ちています。transformの前にload、publishの前にtransform。DAGはこれらを明確に表現し、orchestratorが何を並列実行でき(独立したブランチ)、何が待つ必要があるかを判断できるようにします。循環は、自分自身に依存するtaskを意味し、決して完了できません。
orchestratorにおけるDAG
Airflow、Dagster、PrefectはすべてワークフローをDAGとしてモデル化します。orchestratorはグラフをたどり、準備できたtaskを実行し、失敗をretryし、upstreamが失敗したときにdownstreamのtaskをスキップします。同じ考え方が、build toolとCIの依存グラフの基礎にあります。
DAGとCI
CI/CDのpipeline自体がjobのDAGです。データ作業では、CIは定義されたpipelineのDAGが実際にparseでき、配信前に循環を含まないことも検証します。
jobs:
build: { runs-on: small }
test: { needs: build } # edge: test depends on build
deploy: { needs: [build, test] }Latchkeyノート
DAGは独立したブランチを露出させるため、orchestratorとCIは並列jobをファンアウトできます。Latchkeyでは、これらの並列ブランチが別々のマネージドrunnerで実行されるため、幅の広いDAGがより速く完了し、auto-retryが時折の一時的なtask失敗を処理します。
重要なポイント
- DAGは、pipelineのtaskを循環のない依存関係のエッジで接続されたノードとしてモデル化する。
- 非巡回という性質が有効な実行順序を保証し、orchestratorが独立したブランチを並列化できるようにする。
- AirflowのようなorchestratorとCIのpipelineは、どちらも作業をtaskやjobのDAGとしてモデル化する。