来自https://airflow.apache.org/scheduler.html:
请注意,如果您以一天的schedule_interval运行DAG,则运行 加盖2016年1月1日的戳记将在2016年1月1日至23日之后立即触发在 换句话说,作业实例在其涵盖的期间 结束。
此功能非常有害。
例如,我有每天运行的etl作业,schedule_interval是0 1 * * *
,因此它将触发2019-09-23 01:00:00的2019-09-22 01:00:00作业。但是我的etl正在处理start_date之前的所有数据,这意味着数据范围介于(history,2019-09-23 00:00:00)之间,我们不能使用datetime.now()
,因为它无法复制。这迫使我在执行日期增加了1天:
etl_end_time = "{{ (execution_date + macros.timedelta(days=1)).strftime('%Y-%m-%d 00:00:00') }}"
但是,当我需要使用schedule_interval 45 2,3,4,5,6 * * *
运行作业时,2019-09-22 06:45:00
作业将在2019-09-23 02:45:00
上运行,该日期是execution_date(下一次执行时间)之后的一天。不必增加一天,我不得不更改了schedule_interval 45 2,3,4,5,6,7 * * *
并在上次运行时放置了一个虚拟运算符。
在这种情况下,您无需在执行日期添加一天,这意味着您必须定义两个etl_end_time
来表示具有不同schedule_interval的作业中的同一日期。
所有这些对我来说都很不舒服,是否有任何配置或内置方法使execution_date等于start_date?或者我必须修改气流源代码...
答案 0 :(得分:0)
对于预定的运行, next_execution_date 将返回触发的确切时间。
答案 1 :(得分:0)
我发现有一个公关 https://github.com/apache/airflow/pull/5787
此更改引入了属性schedule_interval_edge,它是一个字符串 包含DAG的“开始”或“结束”。调度程序使用 确定DAG应该在开始时安排还是在 计划时间间隔的结束。
具有相同名称的参数也已添加到 [scheduler]部分中的default_airflow.cfg。
我已经在此课程中使用了密码。