每天特定时间的气流调度
Airflow scheduling for specific times each day
我设置了以下 DAG:
default_dag_args = {
'start_date': datetime.datetime(2021, 6, 25, 0, 0),
'email': 'foobar@foobar.com',
'email_on_failure': True,
'email_on_retry': False,
'retries': 1,
'retry_delay': datetime.timedelta(minutes=30)
}
with models.DAG(
'foobar',
schedule_interval = "30 5,7,9 * * *",
default_args=default_dag_args,
catchup=False) as dag:
我想要的行为是 DAG 将在每天 5:30、7:30 和 9:30 UTC 执行。我看到的行为是 5:30 运行 在 7:30 UTC 执行,7:30 运行 在 9:30 执行,9:30 运行 在第二天 5:30 执行。
根据文档,我想我对为什么会发生这种情况有一个模糊的想法 - 9:30 标记计划周期的结束,因此 9:30 运行 执行在下一个时期的开始。我不知道如何获得我想要的行为。 DAG 在代码中没有任何对调度时间的引用,它只需要在 5:30、7:30 和 9:30 以及 'run time' 处 运行因为 Airflow 认为这无关紧要。
有什么方法可以让 DAG 在绝对时间达到 运行?如果没有,我可以设置什么时间表来获得我想要的行为?
Airflow 不是 cron 作业调度程序。 Airflow 计算 start_date + schedule_interval
并在间隔结束时执行作业。 .
中解释了这背后的原因
你的情况:
start_date=datetime(2021,06,25)
和 schedule_interval = "30 5,7,9 * * *"
给出:
第一个 任务 execution_date 2021-06-25 5:30
将在 2021-06-25 7:30
开始 运行ning
第 2 个 任务 execution_date 2021-06-25 7:30
将在 运行2021-06-25 9:30
开始
第 3 任务 execution_date 2021-06-25 9:30
将在 运行 宁 2021-06-26 5:30
开始
第 4 个 任务 execution_date 2021-06-26 5:30
将在 运行 宁 2021-06-26 7:30
开始
第 5 个 任务 execution_date 2021-06-26 7:30
将在 运行 宁 2021-06-26 9:30
开始
第 6 个 任务 execution_date 2021-06-26 9:30
将在 运行 宁 2021-06-27 5:30
开始
第 7 个 任务 execution_date 2021-06-27 5:30
将在 运行 宁 2021-06-27 7:30
开始
第 8 个 任务 execution_date 2021-06-27 7:30
将在 运行 宁 2021-06-27 9:30
开始
第 9 个 任务 execution_date 2021-06-27 9:30
将在 2021-06-28 5:30
开始 运行ning
等等...
请注意,您每天仍会获得 3 运行s(第一次约会除外),正如您所期望的,这只是了解日程安排工作原理的问题。如果你也想在第一次约会时获得 3 运行,请将你的 start_date
更改为 datetime(2021,06,24,9,30)
。 execution_date 是一个合乎逻辑的日期。如果需要,您可以使用 macros 在 DAG 代码中引用相关日期 - 例如:
我提到 6th 运行 execution_date
是 2021-06-26 9:30
使用带有 运行 的宏可以给你:
prev_execution_date
是 2021-06-26 7:30
next_execution_date
是 2021-06-27 5:30
注意:您的代码有 catchup=False
,所以我在这里写的确切日期不会相同,但这只会影响第一个 运行。后面的运行也是同理。
我设置了以下 DAG:
default_dag_args = {
'start_date': datetime.datetime(2021, 6, 25, 0, 0),
'email': 'foobar@foobar.com',
'email_on_failure': True,
'email_on_retry': False,
'retries': 1,
'retry_delay': datetime.timedelta(minutes=30)
}
with models.DAG(
'foobar',
schedule_interval = "30 5,7,9 * * *",
default_args=default_dag_args,
catchup=False) as dag:
我想要的行为是 DAG 将在每天 5:30、7:30 和 9:30 UTC 执行。我看到的行为是 5:30 运行 在 7:30 UTC 执行,7:30 运行 在 9:30 执行,9:30 运行 在第二天 5:30 执行。
根据文档,我想我对为什么会发生这种情况有一个模糊的想法 - 9:30 标记计划周期的结束,因此 9:30 运行 执行在下一个时期的开始。我不知道如何获得我想要的行为。 DAG 在代码中没有任何对调度时间的引用,它只需要在 5:30、7:30 和 9:30 以及 'run time' 处 运行因为 Airflow 认为这无关紧要。
有什么方法可以让 DAG 在绝对时间达到 运行?如果没有,我可以设置什么时间表来获得我想要的行为?
Airflow 不是 cron 作业调度程序。 Airflow 计算 start_date + schedule_interval
并在间隔结束时执行作业。
你的情况:
start_date=datetime(2021,06,25)
和 schedule_interval = "30 5,7,9 * * *"
给出:
第一个 任务 execution_date 2021-06-25 5:30
将在 2021-06-25 7:30
第 2 个 任务 execution_date 2021-06-25 7:30
将在 运行2021-06-25 9:30
第 3 任务 execution_date 2021-06-25 9:30
将在 运行 宁 2021-06-26 5:30
第 4 个 任务 execution_date 2021-06-26 5:30
将在 运行 宁 2021-06-26 7:30
第 5 个 任务 execution_date 2021-06-26 7:30
将在 运行 宁 2021-06-26 9:30
第 6 个 任务 execution_date 2021-06-26 9:30
将在 运行 宁 2021-06-27 5:30
第 7 个 任务 execution_date 2021-06-27 5:30
将在 运行 宁 2021-06-27 7:30
第 8 个 任务 execution_date 2021-06-27 7:30
将在 运行 宁 2021-06-27 9:30
第 9 个 任务 execution_date 2021-06-27 9:30
将在 2021-06-28 5:30
等等...
请注意,您每天仍会获得 3 运行s(第一次约会除外),正如您所期望的,这只是了解日程安排工作原理的问题。如果你也想在第一次约会时获得 3 运行,请将你的 start_date
更改为 datetime(2021,06,24,9,30)
。 execution_date 是一个合乎逻辑的日期。如果需要,您可以使用 macros 在 DAG 代码中引用相关日期 - 例如:
我提到 6th 运行 execution_date
是 2021-06-26 9:30
使用带有 运行 的宏可以给你:
prev_execution_date
是 2021-06-26 7:30
next_execution_date
是 2021-06-27 5:30
注意:您的代码有 catchup=False
,所以我在这里写的确切日期不会相同,但这只会影响第一个 运行。后面的运行也是同理。