Apache 气流中的开始日期和预定日期问题

J.C*_*man 3 airflow airflow-scheduler

我正在使用 Apache 气流,但我对预定日期和开始日期有疑问。

我希望 dag 每天在 8:00 AM UTC 运行。所以,我所做的是:

default_args = {
        'owner': 'airflow',
        'depends_on_past': False,
        'start_date': datetime(2020, 12, 7, 10, 0,0),
        'email': ['example@emaiil.com'],
        'email_on_failure': True,
        'email_on_retry': False,
        'retries': 1,
        'retry_delay': timedelta(hours=5)
    }
#never run
dag = DAG(dag_id='id', default_args=default_args, schedule_interval='0 8 * * *',catchup=True)
Run Code Online (Sandbox Code Playgroud)

我上传 dag 的那天是 2020-12-07,我想在 2020-12-08 的 08:00:00 运行它

我将 start_date 设置在 2020-12-07 的 10:00:00 以避免在 2020-12-07 的 08:00:00 运行它,并且只在第二天触发它,但它不起作用。

然后我所做的是修改开始日期:

default_args = {
        'owner': 'airflow',
        'depends_on_past': False,
        'start_date': datetime(2020, 12, 7, 7, 59,0),
        'email': ['example@emaiil.com'],
        'email_on_failure': True,
        'email_on_retry': False,
        'retries': 1,
        'retry_delay': timedelta(hours=5)
    }
#never run
dag = DAG(dag_id='etl-ca-cpke-spark_dev_databricks', default_args=default_args, schedule_interval='0 8 * * *',catchup=True)
Run Code Online (Sandbox Code Playgroud)

现在开始日期是 dag 运行前 1 分钟,事实上,因为 catchup 设置为 True,dag 已在 2020-12-07 08:00:00 触发,但尚未触发 2020 -12-08 在 08:00:00。

为什么?

Ela*_*lad 5

间隔结束时的气流调度任务(请参阅文档参考

这意味着当你这样做时:

start_date: datetime(2020, 12, 7, 8, 0,0)
schedule_interval: '0 8 * * *'
Run Code Online (Sandbox Code Playgroud)

一次运行将2020-12-0808:00+- 开始(取决于资源)

这次运行execution_date将是:2020-12-07 08:00

接下来的运行将在踢2020-12-0908:00

此运行execution_date2020-12-08 08:00

因为今天是2020-12-08下一次跑步没有开始,因为它不是间隔的结束

  • 您将像 cronjob 一样解释“start_date”,您指定时间并从该日期开始。这不是 Airflow 的工作原理。Airflow 采用 start_date + 在此期间 **END** 开始运行时的间隔。这背后的逻辑是,当您编写 ETL 时,您希望在窗口间隔结束时运行 -> 今天您希望处理昨天的数据。 (2认同)
  • 遵循相同的逻辑。运行在间隔结束时开始,因此 `start_date = datetime(2020, 12, 8, 8, 0,0)` 和间隔 `0 8 * * *` 将在 `2020-12-09 08:00 结束` 这就是第一次运行开始的时间。请注意,此运行的执行日期为 `2020-12-08 08:00` (2认同)