注意:crontab.guru 链接已损坏,因此我将它们包装在代码块中。
我有一个 DAG,将在太平洋时间周一午夜(世界标准时间)上午 8 点执行,延迟 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 EST,00:01 PST)”。
这会阻止 DAG 每天执行,但它并未在 2019 年 2 月 18 日(更新后的第一个星期一)触发。我读过一些其他帖子,表明开始日期可能会导致此问题,但此任务的开始日期是 datetime(2019, 2, 11, 0, 0, 0, 0, pytz.UTC)
,这是 2019-02-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 时间间隔之后执行吗?
最佳答案
编辑:
您没有看到 18 号运行执行的原因是您有 catchup=False
这将导致 DAG 跳过回填天(如果回填天已经过去)。如果您想看到 DAG 填充第 17 和 24 个,则需要设置 catchup=True
Airflow DAG 在计划间隔的END执行,因此,如果您的开始日期是当前星期一并且间隔是每周一,则 DAG 将不会执行本周一持续到下周一。
这里的主要思想是,当前周一运行的数据现在可用,直到该间隔期结束。这让你从日常工作的角度思考它更有意义。如果您运行的作业正在查找今天的数据,那么该数据集要到今天结束时才会完整。因此,如果您想运行今天的数据,则需要明天执行您的作业。不管你喜欢与否,这只是 Airflow 所采用的约定。
如果您想调整日期,可以使用 {{ Macros.ds_add( ds, 7) }}
将执行日期移动 7 天。
请告诉我这个答案是否有意义。如果没有,我会扩展它。这个约定是我们在开发 Airflow 作业时必须处理的最烦人的细节。
关于python - Airflow cron 计划间隔不触发 DAG,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54830586/