每天特定时间的气流调度

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_date2021-06-26 9:30 使用带有 运行 的宏可以给你:

prev_execution_date2021-06-26 7:30

next_execution_date2021-06-27 5:30

注意:您的代码有 catchup=False,所以我在这里写的确切日期不会相同,但这只会影响第一个 运行。后面的运行也是同理。