【问题标题】:Airflow DAG is triggered twice by scheduler. Weekly DAGAirflow DAG 由调度程序触发两次。每周 DAG
【发布时间】:2019-11-11 18:33:46
【问题描述】:

Airflow 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 每周一会被触发 2 次。相隔 1 分钟:

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

可能的原因是什么?

【问题讨论】:

    标签: airflow scheduler


    【解决方案1】:

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

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

    它没有工作,因为我有我的 start_time :

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

    我在 Airflow 上找到了这个博客 — 通过 CRON 表达式 here 找到确切 [start_date] 的技巧!

    如果是每周工作,您的 start_date 应该是一周前。 于是我改成了'start_date': airflow.utils.dates.days_ago(7)

    现在它工作正常。

    谢谢!!!

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 首先我用 5 位表达式安排了它,从未触发过。然后我查看了 Airflow Document,我看到了总共 6 位数字,还有年份。所以我把它改成了 6 位数,它触发了 DAG。问题是它触发了两次。我不知道为什么会这样。可能是什么原因?
      【解决方案3】:

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

      我假设您的 DAG 会在一分钟内完成。下一个调度程序循环,它看到 cron 调度仍然匹配(在第 58 秒),所以它再次启动 DAG。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-08
        • 1970-01-01
        • 1970-01-01
        • 2021-09-19
        • 1970-01-01
        • 2018-01-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多