Airflow 气流:dag运行,执行日期=触发日期=固定计划
在airflow中,我希望在每周一上午8点运行dag(执行日期当然应该是“当天周一上午8点”)。要为此工作流设置的相关参数包括: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点开始的。这里解释了真实的行为,例如:或 其行为是:在间隔的每一端(在我的例子中为每周)
:“2018-03-19”开始日期
:“0 8**MON”计划时间间隔
执行日期触发日期立即(=当前星期一上午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,我们将使用宏将其递增一天。好的,谢谢,我将使用带有相关日期的自定义宏