Prefect見てみる 動的なDAG編
PrefectやAirflowで言及されている動的なDAGとは
動的なDAG(Dynamic DAG)は、タスクを、DAGの実行時に決まる回数や、引数で繰り返すDAGです。
例えば、
- マルチテナントなシステムで、各テナント毎に処理をしたい
- 似たようなテーブルが複数あって、それぞれに処理を行いたい
ような場合に使いたくなります。
Airflowでの動的なDAG
AIrflowで動的なDAGな対応するには、
- タスクの中でループする
- タスクの外側(DAG定義の部分)でループ(例:Apache Airflow: Create dynamic DAG – Big Data & ETL)
- DAGを動的にDAGから作る(https://www.astronomer.io/guides/dynamically-generating-dags/)
などの方法があります。
ただし、
- リトライの単位が大きくなってしまう
- タスク固有の制御(リトライやプール)が効かない
- DAGの構造が変わると過去のDAG Runが不確実になる
などの欠点があり、無理ではないがちょっと考えたくなる感じです。
Prefect
Prefectでは、
の2つの方法で動的なDAGを、最初からサポートしています。
マップの場合、タスクにリスト(Pythonの普通のやつ)を渡す、もしくは返すことで、実行時に繰り返し数が決まるDAGを定義出来ます。
シグナルは、タスク中でLOOPという例外をraiseする事で、同じタスクを(ただし違う引数で)繰り返すDAGを定義出来ます。
気になること
そのうち調べます。
- マップとシグナルの使い分けは?
- 複数あるタスクが失敗した時の扱いは?
- DAG 実行履歴の扱いは?過去のタスクインスタンスの繰り返し回数や、引数を確認出来る?