气流 cron 计划间隔不触发 DAG
Airflow cron schedule interval not triggering DAG
注意:crontab.guru 链接已损坏,因此我将它们包装在代码块中。
我有一个 DAG 将在太平洋时间周一午夜,UTC 时间上午 8 点执行,延迟 1 分钟以避免任何重叠问题。
最初计划间隔设置为 1 8 */1 * 1
,根据 https://crontab.guru/#1_8_*/1_*_1
为 "At 08:01 UTC (03:01 EST, 00:01 PST) on every day-of-month if it's on Monday"。
然而,这导致 DAG 每天在 08:01 UTC 触发;星期一条件似乎被忽略了。
计划间隔已更新为更简单的 1 8 * * 1
,根据 https://crontab.guru/#1_8_*_*_1
为 "At 08:01 UTC (03:01 EST, 00:01 PST) on Monday"。
这使 DAG 不再每天执行,但并未在更新后的第一个星期一 2019-02-18 触发。我读过一些其他帖子表明开始日期可能会导致此问题,但此任务的开始日期是 datetime(2019, 2, 11, 0, 0, 0, 0, pytz.UTC)
,比 2019-02-18 运行 日期早两个间隔。
这是完整的 DAG/task 定义(没有导入或特定名称):
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 跳过回填天数。如果你想在 17 号和 24 号看到 DAG 填充,你需要设置 catchup=True
Airflow DAG 在 计划间隔 的 END 执行,因此如果您的开始日期是当前星期一并且您的间隔是每个星期一,DAG 直到下星期一才会执行这个星期一的 运行。
这里的主要思想是当前星期一的数据 运行 现在可以使用,直到该间隔期结束。这使您从日常工作的角度考虑它更有意义。如果您 运行 正在寻找今天的数据,那么该数据集要到今天结束才能完成。所以如果你想 运行 今天的数据,你需要明天执行你的工作。不管喜欢与否,这只是 Airflow 采用的约定。
如果您想调整日期,您可以使用{{ macros.ds_add( ds, 7) }}
将执行日期移动7天。
让我知道这个答案是否有意义。如果没有,我将对其进行扩展。这个约定是我们在为 Airflow 作业开发时必须处理的最烦人的细节。
注意:crontab.guru 链接已损坏,因此我将它们包装在代码块中。
我有一个 DAG 将在太平洋时间周一午夜,UTC 时间上午 8 点执行,延迟 1 分钟以避免任何重叠问题。
最初计划间隔设置为 1 8 */1 * 1
,根据 https://crontab.guru/#1_8_*/1_*_1
为 "At 08:01 UTC (03:01 EST, 00:01 PST) on every day-of-month if it's on Monday"。
然而,这导致 DAG 每天在 08:01 UTC 触发;星期一条件似乎被忽略了。
计划间隔已更新为更简单的 1 8 * * 1
,根据 https://crontab.guru/#1_8_*_*_1
为 "At 08:01 UTC (03:01 EST, 00:01 PST) on Monday"。
这使 DAG 不再每天执行,但并未在更新后的第一个星期一 2019-02-18 触发。我读过一些其他帖子表明开始日期可能会导致此问题,但此任务的开始日期是 datetime(2019, 2, 11, 0, 0, 0, 0, pytz.UTC)
,比 2019-02-18 运行 日期早两个间隔。
这是完整的 DAG/task 定义(没有导入或特定名称):
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 跳过回填天数。如果你想在 17 号和 24 号看到 DAG 填充,你需要设置 catchup=True
Airflow DAG 在 计划间隔 的 END 执行,因此如果您的开始日期是当前星期一并且您的间隔是每个星期一,DAG 直到下星期一才会执行这个星期一的 运行。
这里的主要思想是当前星期一的数据 运行 现在可以使用,直到该间隔期结束。这使您从日常工作的角度考虑它更有意义。如果您 运行 正在寻找今天的数据,那么该数据集要到今天结束才能完成。所以如果你想 运行 今天的数据,你需要明天执行你的工作。不管喜欢与否,这只是 Airflow 采用的约定。
如果您想调整日期,您可以使用{{ macros.ds_add( ds, 7) }}
将执行日期移动7天。
让我知道这个答案是否有意义。如果没有,我将对其进行扩展。这个约定是我们在为 Airflow 作业开发时必须处理的最烦人的细节。