如何使气流调度在开始日期而不是执行日期触发(使执行日期等于开始日期)?

时间:2019-09-23 03:06:49

标签: python airflow airflow-scheduler

来自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?或者我必须修改气流源代码...

2 个答案:

答案 0 :(得分:0)

对于预定的运行, next_execution_date 将返回触发的确切时间。

答案 1 :(得分:0)

我发现有一个公关 https://github.com/apache/airflow/pull/5787

  

此更改引入了属性schedule_interval_edge,它是一个字符串   包含DAG的“开始”或“结束”。调度程序使用   确定DAG应该在开始时安排还是在   计划时间间隔的结束。

     

具有相同名称的参数也已添加到   [scheduler]部分中的default_airflow.cfg。

我已经在此课程中使用了密码。