web-dev-qa-db-ja.com

エアフロー:エアフローサブダグを1回実行するパターン

気流のドキュメントから:

SubDAGs must have a schedule and be enabled. If the SubDAG’s schedule is set to None or @once, the SubDAG will succeed without having done anything

サブダゴペレーターは実際にはBackfillJobとして実装されているため、オペレーターにschedule_intervalを提供する必要があることを理解しています。ただし、サブダグのschedule_interval="@once"と同等のセマンティックを取得する方法はありますか?サブダグにsetschedule_interval="@daily"を使用すると、サブダグの実行に1日以上かかると、サブダグが複数回実行される可能性があるのではないかと心配しています。

def subdag_factory(parent_dag_name, child_dag_name, args):
    subdag = DAG(
        dag_id="{parent_dag_name}.{child_dag_name}".format(
            parent_dag_name=parent_dag_name, child_dag_name=child_dag_name
        ),
        schedule_interval="@daily", # <--- this bit here
        default_args=args
    )

    ... do more stuff to the subdag here
    return subdag

TLDR:「このサブダグを親ダグのトリガーごとに1回だけ実行する」を偽造する方法

11
gnicholas

見つけた schedule=@once私のサブダグには問題なく動作します。おそらく私のバージョンは古くなっていますが、すべてのタスクが成功した(またはスキップされた)場合でも、サブダグでより多くの問題が発生しました失敗

現在、私のマシンで非常にうまく実行されている実際のサンプルコードは次のとおりです。

subdag_name = ".".join((parent_name,child_name))
logging.info(parent_name)
logging.info(subdag_name)
dag_subdag = DAG(
    dag_id=subdag_name,
    default_args=dargs,
    schedule_interval="@once",
)

実際、私は当初、ほとんどすべてのダグをサブダグ用の栄光のcfgファイルとして作成しました。試行錯誤の末にどれだけ良いアイデアかはわかりませんが、スケジュールの間隔が私にとって妨げになることはありませんでした。

カスタマイズをほとんど行わずに、比較的最近の1.8のビルドを実行しています。私は、サブダグをdagBagに表示されないように、dagsフォルダー内のフォルダーに保持するというdagの提案例に従っています。

5
apathyman

サブダグにschedule = Noneを指定して外部トリガーパターンを試してください。その場合、親のdagによってトリガーされたときにのみ実行されます

2
Priyank Mehta