Skip to content
Latchkey

データパイプラインにおける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でき、配信前に循環を含まないことも検証します。

A CI pipeline expressed as a DAG
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としてモデル化する。

関連ガイド