【问题标题】:Airflow cron schedule interval not triggering DAG气流 cron 计划间隔未触发 DAG
【发布时间】:2019-03-02 02:22:36
【问题描述】:

注意:crontab.guru 链接已断开,因此我将它们包装在代码块中。

我有一个 DAG,它要在太平洋时间周一午夜 8 点(UTC 时间)执行,并提前 1 分钟执行以避免任何重叠问题。

最初的计划间隔设置为1 8 */1 * 1,根据https://crontab.guru/#1_8_*/1_*_1 是“如果是在星期一,则在每月的每一天的 08:01 UTC(03:01 EST,00:01 PST)”。

但是,这导致 DAG 在每天 08:01 UTC 触发;星期一的情况似乎被忽略了。

计划间隔已更新为更简单的 1 8 * * 1,根据 https://crontab.guru/#1_8_*_*_1,它是“周一 08:01 UTC(美国东部标准时间 03:01,太平洋标准时间 00:01)”。

这阻止了 DAG 每天执行,但它没有在 2019 年 2 月 18 日(更新后的第一个星期一)触发。我读过一些其他帖子,表明开始日期可能会导致此问题,但此任务的开始日期是 datetime(2019, 2, 11, 0, 0, 0, 0, pytz.UTC),这是 2019 年 2 月 18 日运行日期之前的两个间隔。

这是完整的 DAG/任务定义(没有导入或特定名称):

dag = DAG(
    dag_id="dag",
    description="dag",
    # At 08:01 UTC (03:01 EST, 00:01 PST) on Monday
    # (https://crontab.guru/#1_8_*_*_1)
    schedule_interval="1 8 * * 1",
    catchup=False,
)


task = PythonOperator(
    task_id="handle",
    provide_context=True,
    python_callable=handle,
    dag=dag,
    retries=2,
    retry_delay=timedelta(minutes=15),
    start_date=datetime(2019, 2, 11, 0, 0, 0, 0, pytz.UTC),
)

知道为什么这不会在 2019-02-18 00:01 UTC 间隔之后执行吗?

【问题讨论】:

  • 要去写一个答案,我觉得是对的。如果没有我在 cmets 中上述问题的答案,则不确定
  • 下周星期一执行了吗?

标签: python cron airflow directed-acyclic-graphs


【解决方案1】:

编辑: 你在 18 号看不到运行的原因是你有 catchup=False

这将导致 DAG 跳过已经过去的回填天。如果你想看到 DAG 填写第 17 和 24 号,你需要设置catchup=True

Airflow DAG 在 Schedule IntervalEND 执行,因此如果您的开始日期是当前星期一并且您的间隔是每周一,则 DAG 将不会执行这个星期一的运行直到下一个星期一。

这里的主要思想是当前星期一运行的数据现在可用,直到该间隔期结束。这让你从日常工作的角度考虑它更有意义。如果您正在运行一项正在寻找今天数据的工作,那么该数据集将在今天结束之前完成。所以如果你想运行今天的数据,你需要明天执行你的工作。这只是 Airflow 采用的约定,不管你喜不喜欢。

如果您想调整日期,您可以使用{{ macros.ds_add( ds, 7) }} 将执行日期更改7天。

让我知道这个答案是否有意义。如果没有,我会扩展它。这个约定是我们在开发 Airflow 作业时必须处理的最烦人的细节。

【讨论】:

  • 您好,感谢您的评论,我直到星期三才离开办公室,所以我会检查一下。你写的所有内容都有意义,并且与我过去读过的内容一致,除了在这种情况下,开始日期已经偏移了一个间隔。如果您查看我发布的定义,是否看起来我设置不正确?
  • 它确实在 2 月 25 日运行,但鉴于开始日期,我仍然不确定为什么它没有在前一个星期一运行。
  • 在 DAG 添加到 DAG 文件夹后,您是否更改了开始日期?
  • 你有删除 DAG 吗?我会尝试从您的数据库中删除对 DAG 的所有引用。 Airflow 真的不喜欢更改开始日期。我有不同的结果与更改时间表间隔。尤其是如果您将时间间隔从每天执行一次更改为每周一次。当 Airflow 第一次看到具有该名称的 DAG 时,DAG 和计划参考点将被解析到数据库中。运行后对其进行的任何更改对于引擎来说都难以理解。
  • 不,开始日期最初添加为datetime(2019, 2, 11, 0, 0, 0, 0, pytz.UTC) 并且没有更改。唯一的改变是 cron 从1 8 */1 * 1 设置为1 8 * * 1。我仍然不能 100% 确定我理解为什么原始 cron 会导致 DAG 每天执行,即使考虑到间隔结束也是如此。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
相关资源
最近更新 更多