如何运行Airflow DAG特定次数?

时间:2018-12-14 06:57:14

标签: airflow google-cloud-composer

如何运行气流dag指定次数?

我尝试使用TriggerDagRunOperator,此运算符对我有用。 在可调用函数中,我们可以检查状态并决定是否继续。

但是需要保持当前的计数和状态。

使用上述方法,我可以重复DAG“运行”。

需要专家意见,是否还有其他其他方法可以使Airflow DAG运行X倍? 谢谢。

2 个答案:

答案 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)

  • Airflow本身不支持此功能
  • 但是通过利用meta-db,我们可以自己完成此功能

我们可以编写一个自定义运算符/ python运算符

  • 在运行实际计算之前,请检查元数据库中是否已为任务(TaskInstance表)运行'n'。 (请参阅task_command.py以获得帮助)
  • 如果这样做,只需跳过任务(raise AirflowSkipExceptionreference

这篇出色的文章可以用来启发:Use apache airflow to run task exactly once


注意

这种方法的缺点在于,它假设将永远(正确地)保留历史任务(TaskInstance)运行

  • 在实践中,我经常发现task_instances丢失了(我们将catchup设置为False
  • 此外,在大型Airflow部署中,可能需要设置meta-db的常规 cleanup ,这将使这种方法无法实现