Airflow DAG 中“schedule_interval=None”和“start_date=airflow.utils.dates.days_ago(n)”的含义?

Meaing of `schedule_interval=None` and `start_date=airflow.utils.dates.days_ago(n)` in an Airflow DAG?

我不明白如何解释 Airflow DAG 中 schedule_interval=Nonestart_date=airflow.utils.dates.days_ago(3) 的组合。如果 schedule_interval'@daily',那么(我认为)下面的 DAG 会等待第二天的开始,然后每天三次 运行,回填 days_ago(3).我知道因为 schedule_interval=None,它必须手动启动,但我不理解除此之外的行为。 days_ago(3) 有什么意义?

dag = DAG(
    dag_id="chapter9_aws_handwritten_digit_classifier",
    schedule_interval=None,
    start_date=airflow.utils.dates.days_ago(3),
)

例子来自https://github.com/BasPH/data-pipelines-with-apache-airflow/blob/master/chapter07/digit_classifier/dags/chapter9_digit_classifier.py

你的困惑是可以理解的。这也让 Airflow 调度程序感到困惑,这就是为什么对 start_date 使用动态值被认为是一种不好的做法。引用自Airflow FAQ

We recommend against using dynamic values as start_date

这是因为 Airflow 以 start_date 为基准,以 schedule_interval 为周期来计算 DAG 调度。当到达周期结束时,DAG 被触发。然而,当 start_date 是动态的时,存在周期永远不会结束的风险,因为基数总是在“移动”。

为了减轻您的困惑,只需将 start_date 更改为某个静态值,然后它对您来说就有意义了。

还注意到您提到的指南是在 AIP-39 Richer scheduler_interval was implemented. Starting Airflow 2.2.0 it's much easier to schedule DAGs. You can read about Timetables in the documentation 之前编写的。