气流 dag 滞后一个月

Airflow dag lagging a month

根据研究和我的 DAG 的行为方式,如果我有这样的 dag 设置:

default_args = {
    'owner': 'Airflow',
    'depends_on_past': False,
    'start_date': datetime(2021, 6, 25),
    'email_on_failure': False,
    'email_on_retry': False,
    'retries': 0,
    'retry_delay': timedelta(seconds=100),
    'provide_context': True
}

dag = DAG(
    dag_id='my_dag',
    default_args=default_args,
    catchup=True,
    schedule_interval='0 6 25 * *'
)

每月 25 日早上 6 点 运行。例如,给定上述配置,如果今天是 8 月 25 日,而我今天创建此 DAG,它将 运行 6 月 25 日和 7 月 25 日,因为 catchup = True。但是,6/25 和 7/25 DAG 运行 分别在 7/25 和 8/25 执行

我理解这是因为 DAG 在周期结束时执行,但我发现它具有极大的误导性。我希望 8/25 运行 的执行日期显示为 8/25,而不是 7/25 - 有没有办法覆盖它?也许 {{ next_ds }} 不知何故?

谢谢!

我认为您可以尝试将 'start_date' 设置为更早的日期,而不是确切的 6/25。如果开始日期是6/20,第一个运行将在6/25执行。

您混淆了逻辑 运行 日期和它正在处理的数据间隔 window。

如您所知,DAG 安排在间隔结束时。这意味着 2021-06-25 的 运行 以每月为间隔将在 2021-07-25 上执行。这是你无法控制也无法改变的。这就像 Airflow 的工作原理一样。我在此处添加旁注,因为 AIP-39 Richer scheduler_interval 将来会更改它。

但是,以上所有内容并不意味着您无法控制此 运行 实际处理的日期。对此你有完全的控制权。您可以解析任何 window 上的记录 - 昨天数据、上周数据、上个月数据 - 任何您想要的数据。你决定那个。正如您提到的了解如何“玩”这些 windows 和 macros {{ ds }}, {{ next_ds }}, {{ prev_ds }} 等的关键...如果需要,您也可以编写自己的自定义宏。 剩下的就是了解此宏的每个值在特定 运行 中的含义,以便您可以选择要在代码中使用的宏。假设您的代码正在执行 SQL: SELECT val FROM table WHERE date IS BETWEEN x AND Y。在此SQL x & Y 将被宏替换。

根据您的设置,值将为:

execution_date will run on prev_ds ds next_ds
2021-06-25 2021-07-25 None 2021-06-25 2021-07-25
2021-07-25 2021-08-25 2021-06-25 2021-07-25 2021-08-25
2021-08-25 2021-09-25 2021-07-25 2021-08-25 2021-09-25
2021-09-25 2021-10-25 2021-08-25 2021-09-25 2021-10-25