如何在 Apache Airflow 运行 中制作一个像简单的 cron 作业一样的 DAG?
How to make a DAG in Apache Airflow run like a simple cron job?
Airflow 调度器在过去几天让我有点摸不着头脑,因为它甚至在 catchup=False
之后回填 dag 运行s。
我的时区感知 dag 的开始日期为 13-04-2021 19:30 PST
或 14-04-2021 2:30 UTC
并且具有以下配置:
# define DAG and its parameters
dag = DAG(
'backup_dag',
default_args=default_args,
start_date=pendulum.datetime(2021, 4, 13, 19, 30, tz='US/Pacific'), # set start_date in US/Pacific (PST) timezone
description='A data backup pipeline',
schedule_interval="30 19 * * *", # 7:30 PM every day
catchup=False,
is_paused_upon_creation=False
)
这个 dag 运行s 在边缘设备上,该边缘设备有时打开有时关闭。我希望这个 dag 基本上将其 运行 安排在 19:30 PST
或 2:30 UTC
,只要边缘设备打开,否则不要。奇怪的是,当我将带有 dag 的容器部署到边缘设备时,dag 会在计划间隔之外自动启动它的第一个 运行,即使该间隔已经过去!
我在这里错过了什么?我无法理解为什么调度程序会这样做
以下是我阅读所有文档后的理解,如有错误请指正。
DAG 由调度程序在 2021-04-19T011:30:00+00:00 UTC
拾取,理想情况下它应该 运行 在 2021-04-20T02:30:00+00:00 UTC
根据 dag 配置。以下所有时间均为 UTC
Dag Start_date 1st run(skip catchup=false) 2nd run(skip catchup=false) 3rd run(skip catchup=false) 4th run(skip catchup=false)
2021-04-14T02:30:00+00:00 ---> 2021-04-15T02:30:00+00:00 ---> 2021-04-16T02:30:00+00:00 ---> 2021-04-17T02:30:00+00:00 ---> 2021-04-18T02:30:00+00:00 --->
5th run(skip catchup=false) 6th run(should execute)
2021-04-19T02:30:00+00:00 ---> 2021-04-20T02:30:00+00:00
那么,为什么第 5 个 运行 发生在间隔 2021-04-18T02:30:00+00:00
到 2021-04-19T02:30:00+00:00
之间,即使间隔已经过去?
我希望 DAG 仅在其间隔到来时 运行。
这是预期的气流行为:
turn catchup off. [...] When turned off, the scheduler creates a DAG run only for the latest interval.
Catchup section 中的相应示例与您的类似,并更详细地解释了行为。
我能想到的一个肮脏的解决方法是设置 schedule_interval=None
并使用 CLI 从 cron 实际触发 DAG。
Airflow 调度器在过去几天让我有点摸不着头脑,因为它甚至在 catchup=False
之后回填 dag 运行s。
我的时区感知 dag 的开始日期为 13-04-2021 19:30 PST
或 14-04-2021 2:30 UTC
并且具有以下配置:
# define DAG and its parameters
dag = DAG(
'backup_dag',
default_args=default_args,
start_date=pendulum.datetime(2021, 4, 13, 19, 30, tz='US/Pacific'), # set start_date in US/Pacific (PST) timezone
description='A data backup pipeline',
schedule_interval="30 19 * * *", # 7:30 PM every day
catchup=False,
is_paused_upon_creation=False
)
这个 dag 运行s 在边缘设备上,该边缘设备有时打开有时关闭。我希望这个 dag 基本上将其 运行 安排在 19:30 PST
或 2:30 UTC
,只要边缘设备打开,否则不要。奇怪的是,当我将带有 dag 的容器部署到边缘设备时,dag 会在计划间隔之外自动启动它的第一个 运行,即使该间隔已经过去!
我在这里错过了什么?我无法理解为什么调度程序会这样做
以下是我阅读所有文档后的理解,如有错误请指正。
DAG 由调度程序在 2021-04-19T011:30:00+00:00 UTC
拾取,理想情况下它应该 运行 在 2021-04-20T02:30:00+00:00 UTC
根据 dag 配置。以下所有时间均为 UTC
Dag Start_date 1st run(skip catchup=false) 2nd run(skip catchup=false) 3rd run(skip catchup=false) 4th run(skip catchup=false)
2021-04-14T02:30:00+00:00 ---> 2021-04-15T02:30:00+00:00 ---> 2021-04-16T02:30:00+00:00 ---> 2021-04-17T02:30:00+00:00 ---> 2021-04-18T02:30:00+00:00 --->
5th run(skip catchup=false) 6th run(should execute)
2021-04-19T02:30:00+00:00 ---> 2021-04-20T02:30:00+00:00
那么,为什么第 5 个 运行 发生在间隔 2021-04-18T02:30:00+00:00
到 2021-04-19T02:30:00+00:00
之间,即使间隔已经过去?
我希望 DAG 仅在其间隔到来时 运行。
这是预期的气流行为:
turn catchup off. [...] When turned off, the scheduler creates a DAG run only for the latest interval.
Catchup section 中的相应示例与您的类似,并更详细地解释了行为。
我能想到的一个肮脏的解决方法是设置 schedule_interval=None
并使用 CLI 从 cron 实际触发 DAG。