Airflow 气流:dag运行,执行日期=触发日期=固定计划

Airflow 气流:dag运行,执行日期=触发日期=固定计划,airflow,Airflow,在airflow中,我希望在每周一上午8点运行dag(执行日期当然应该是“当天周一上午8点”)。要为此工作流设置的相关参数包括: 开始日期:“2018-03-19” 计划时间间隔:“0 8**MON” 我希望每周一早上8点能看到dag跑步。第一个将于2018年3月19日上午8点运行,执行日期为2018-03-19-08-00-00,依此类推,每周一 然而事实并非如此:dag不是在2018年3月19日上午8点开始的。这里解释了真实的行为,例如:或 其行为是:在间隔的每一端(在我的例子中为每周)

在airflow中,我希望在每周一上午8点运行dag(执行日期当然应该是“当天周一上午8点”)。要为此工作流设置的相关参数包括:

  • 开始日期
    :“2018-03-19”
  • 计划时间间隔
    :“0 8**MON”
我希望每周一早上8点能看到dag跑步。第一个将于2018年3月19日上午8点运行,执行日期为2018-03-19-08-00-00,依此类推,每周一

然而事实并非如此:dag不是在2018年3月19日上午8点开始的。这里解释了真实的行为,例如:或 其行为是:在间隔的每一端(在我的例子中为每周),运行dag,执行日期=间隔的开始(即前一周)。这种行为显然是由“ETL思维方式”驱动的(参见上面的链接)。但这绝对不是我想要的

如何在每个星期一上午8:00使用
执行日期
触发日期
立即(=当前星期一上午8点)运行dag


感谢

这就是气流的行为,它总是在持续时间结束时运行。详细的行为和规则

但为了让它在本周运行,我们可以做的是操纵DAG的执行日期。这可能是在
日期时间
对象(如果是周计划)中添加7天的形式,也可能使用
{{next_execution_date}}

同意只有在DAG中以某种方式使用了日期或由其触发了依赖项时,才可能这样做

再次澄清一下,DAG仍在按照其正常行为运行。我们要做的唯一一件事就是在program/DAG中操纵
date

args = { ....
    'start_date': datetime.datetime(2018,3,18)
}
dag = DAG(...
    schedule_interval = "@weekly"
)

# DAG would run on 3/25/2018 for week of 18th March

# but lets say we manipulate here 
# {{ next_execution_date }} macro
# or add 7 days 
# So basically we are running with date 3/25/2018 instead of 3/18/2018 for the week of 18th March 
以开始时间和执行日期为例

你想每周一早上8点跑步

所以这部分将保持不变:

schedule_interval: '0 8 * * MON',
您希望它在2018-03-19运行第一次运行,因为第一次运行发生在开始日期后的第一个完整计划期结束时,您应该将开始日期更改为:

start_date: datetime(2018,03,12),
您将不得不接受这样一个事实:气流将以每个周期的开始命名DAG运行,并根据设置为间隔周期开始的
执行日期
传入宏。相应地调整你的逻辑

您的第一次运行将在
2018-03-19T08:00:00.0Z
执行日期之后开始,取决于它的每一个其他宏,DagRun的名称将为
2018-03-12T08:00:00.0Z

只要您了解执行日期的期望值,并且不试图将时间基于日期时间。现在()
您的DAG将能够在操作中是幂等的。您可以在任何
PythonOperator
或自定义运算符(从任务上下文获取执行日期)中创建一个新变量,如
my_execution\u date=execution\u date+datetime.timedelta(7)
,使用模板语句如
{(execution\u date+macros.timedelta(7)).strftime(“%Y%m%d')}
{{macros.ds_add(ds,7)}
,或使用
下一个执行日期

您甚至可以添加一个dag级别的
user\u defined\u宏
,比如
{'dt':lambda d:d+datetime.timedelta(days=7)}
来启用
{{dt(execution\u date)}
,最近添加了
user\u defined\u过滤器
,比如
{'dt lambda d:d+datetime.timedelta(days=7)}
启用
next\u ds
next\u execution\u date
将更容易满足您的需要


在考虑模板化时,您不妨阅读一下内置的内容:

对于我来说,我是这样解决的:

{{ ds if dag_run.external_trigger or dag_run.is_backfill else macros.ds_add(ds, 1) }}
如果DAG由外部触发器运行,则不应更改
ds
。 如果DAG是通过回填运行的,我们不应该更改
ds

如果安排了DAG,我们将使用宏将其递增一天。

好的,谢谢,我将使用带有相关日期的自定义宏