【问题标题】:Airflow scheduling for specific times each day每天特定时间的气流调度
【发布时间】:2026-01-28 11:00:02
【问题描述】:

我设置了以下 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 运行,而 Airflow 认为它无关紧要的“运行时间”。

有没有办法让 DAG 在绝对时间运行?如果没有,我可以设置什么时间表来获得我想要的行为?

【问题讨论】:

    标签: airflow airflow-scheduler


    【解决方案1】:

    Airflow 不是 cron 作业调度程序。 Airflow 计算start_date + schedule_interval 并在间隔结束时执行作业。这背后的原因在this answer 中有解释。

    在您的情况下: start_date=datetime(2021,06,25)schedule_interval = "30 5,7,9 * * *" 给出:

    第一个 个执行日期为 2021-06-25 5:30 的任务将在 2021-06-25 7:30 开始运行

    第二个任务,execution_date 2021-06-25 7:30 将在 2021-06-25 9:30 开始运行

    第三个任务,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 次(第一次除外),正如您所期望的,这只是了解调度的工作原理的问题。如果您还想在第一个日期运行 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,所以我在这里写的确切日期不会相同,但这只会影响第一次运行。以下运行将遵循相同的逻辑。

    【讨论】: