调度程序触发了两次DAG气流。每周DAG

时间:2019-11-11 18:33:46

标签: airflow scheduler

对于以下配置,气流DAG在星期一触发两次。

当我使用30 11 * * 1 cron表达式时,DAG根本不会触发。所以想通了,我必须在表达式中再加上一个*。 30 11 * * 1 *-有效。

default_args:
'start_date': airflow.utils.dates.days_ago(1)

DAG: schedule_interval = 30 11 * * 1 *,##这是每周一次,运行时间为星期一11:30。

但是,DAG每个星期一都会触发两次。相距1分钟:

  • 11:30:05
  • 11:30:58

可能是什么原因?

3 个答案:

答案 0 :(得分:0)

6位数的cron表达式不正确,您输入的第一个正确。您运行了DAG几次? 我建议您尝试先运行schedule_interval=@weekly,看看会发生什么?

答案 1 :(得分:0)

正在使用气流的cron解析器将第六位解释为秒(如您在此处看到:https://github.com/kiorky/croniter/blob/master/src/croniter/tests/test_croniter.py#L14)。

我假设您的DAG在一分钟内完成。在下一个计划程序循环中,它看到cron计划仍然匹配(在第58秒),因此它再次启动了DAG。

我遇到了同样的问题,因为Airflow文档链接到有关cron的Wikipedia条目,其中显示了6个条目。 6个条目是非标准的,并且有多个实现。无论如何,对于Airflow,第六项被解释为秒。

您的5位cron表达式应该起作用。也许再试一次?但是,请更改dag id,否则您可能会遇到奇怪的行为:来自https://cwiki.apache.org/confluence/display/AIRFLOW/Common+PitfallsChanging schedule interval always requires changing the dag_id, because previously run TaskInstances will not align with the new schedule interval

答案 2 :(得分:0)

所以最后,我找出了问题所在。

是的,正确的是5位数的cron表达式。 我正在使用schedule_interval = 30 11 * * 1 #(Every Monday 11:30 UTC)

这没用,因为我有start_time:

'start_date': airflow.utils.dates.days_ago(1)

我在Airflow上找到了这个博客—窍门是通过CRON表达式https://github.com/openlayers/openlayers/pull/10363找到确切的[开始日期]!

如果是每周工作,则起始日期应该是一周前。 所以我将其更改为'start_date': airflow.utils.dates.days_ago(7)

现在一切正常。

谢谢!