如何运行气流dag指定次数?
我尝试使用TriggerDagRunOperator,此运算符对我有用。 在可调用函数中,我们可以检查状态并决定是否继续。
但是需要保持当前的计数和状态。
使用上述方法,我可以重复DAG“运行”。
需要专家意见,是否还有其他其他方法可以使Airflow DAG运行X倍? 谢谢。
答案 0 :(得分:2)
恐怕Airflow完全是基于时间的计划。
您可以将时间表设置为None
,然后使用API to trigger runs,但是您可以在外部进行设置,从而保持确定何时以及为何在外部触发的计数和状态。
当您说您的DAG可能有5个任务要运行10次,而一次运行需要2个小时,而您又不能根据时间进行调度时,这很令人困惑。我们不知道2个小时对您有什么意义,或者为什么它必须运行10次,也不知道为什么您不能安排它每天运行一次这5个任务。有了一个简单的每日时间表,它几乎每天都会在同一时间运行一次,因此在任何一天中花费的时间都不会超过2个小时。对吧?
您可以将start_date
设置为11天(虽然是固定日期,但不要动态设置),将end_date
设置为今天(也是固定的),然后每天添加{{ 1}}和1的schedule_interval
,您将获得10次准确的运行,它将在不发生重叠的情况下背对背运行,而相应地更改max_active_runs
,然后停止。或者,您可以仅将execution_date
与预定的airflow backfill
DAG和执行日期时间一起使用。
您是说要它每2小时连续运行一次,但有时它会运行更长的时间,并且您不希望它与运行重叠吗?好吧,您绝对可以安排它每2个小时运行一次(None
),并将0 0/2 * * *
设置为1,这样,如果之前的运行尚未完成,则下一次运行将等待,然后在前一个已经完成。请参阅https://airflow.apache.org/faq.html#why-isn-t-my-task-getting-scheduled中的最后一个项目符号。
如果您希望DAG在点上准确地每2个小时运行一次(给或安排一些调度程序滞后,是的,这是一件事情),并且让先前的运行继续进行,那通常是默认行为,但是您可以添加{{ 1}}处理一些本身不应该同时运行的重要任务(例如创建,插入或删除临时表),或使用具有单个插槽的池。
如果您准备开始下一个计划,则没有任何功能可以终止上一个运行。如果先前的运行尚未完成,则可能会跳过当前运行,但我忘记了它是如何完成的。
基本上,这是您的大多数选择。您也可以为计划外的DAG创建手动max_active_runs
;一次创建10个(使用UI或CLI而不是API,但是API可能更容易)。
这些建议是否能解决您的问题?由于不清楚为什么要运行固定数量,运行频率或时间表和条件,因此很难提供具体建议。
答案 1 :(得分:1)
我们可以编写一个自定义运算符/ python运算符
TaskInstance
表)运行'n'。 (请参阅task_command.py
以获得帮助)raise AirflowSkipException
,reference)这篇出色的文章可以用来启发:Use apache airflow to run task exactly once
注意
这种方法的缺点在于,它假设将永远(正确地)保留历史任务(TaskInstance
)运行
catchup
设置为False
)