使用每周Airflow工作的运行日期的雄辩方法是什么?

时间:2018-04-04 21:23:39

标签: airflow airflow-scheduler

问题:Airflow的execution_date被定义为两次运行之间的开始。例如,按周计划运行的DAG将在 2018-01-08 T11:00:00 上运行,但execution_date 2018-01-01 T11: 1点

目标:我每周收到一次文件,文件名是文件日期。为了识别文件,我想使用Airflow的execution_date。但我似乎无法找到一种方法来使用运行日期,而不是使用最早的execution_date一段时间。

可能的解决方案

  • 动态修改execution_date。类似于:context['execution_date'] + timedelta(days=7)。这看起来很糟糕。
  • 每天运行DAG,在DAG执行图的开头插入ShortCircuitOperator,如果execution_date不是预期日期,请退出。

欢迎所有建议或建议。这是一个细微的问题,但导致我的ETL管道出现一些问题。

2 个答案:

答案 0 :(得分:2)

另一种可能的解决方案?

  • 让你的DAG每周运行一次,就在你" think"文件将到达。解析着陆区域中的文件名称,这将为您提供一堆日期。检查并查看execution_date + schedule_interval之间的哪些日期(如果您使用的是airflow版本> = 1.8,则查看next_execution_date)。然后摄取匹配的文件。

我认为使用execution_date + timedelta(days = 7)有点hacky,intead使用execution_date + schedule_interval,这样如果间隔发生变化则不应该是任何问题(我为我的一个DAGS做这个) )。如果您使用的是较新的气流版本,那么您可以使用更好的next_execution_date。

答案 1 :(得分:2)

我正在使用宏解决此问题。

此功能(用于宏)也可以处理手动触发。

def weekly_today(execution_date, run_id, years=0, months=0, days=0, fmt="%Y%m%d"):
    d = pendulum.instance(execution_date)
    if run_id.startswith('scheduled_'):
        d = d.add(days=7)
    return d.add(years=years, months=months, days=days).strftime(fmt)

此功能应作为user_defined_macros添加到DAG中

dag = DAG(
    dag_id='test',
    start_date=timezone.datetime(2019, 6, 24, 6),
    schedule_interval=timedelta(days=7),
    user_defined_macros={
        'weekly_today': weekly_today
    },
)

我需要设置从1年前到今天的数据范围。 这是示例宏用法。

from_macro = '{{ weekly_today(execution_date, run_id, years=-1) }}'
to_macro = '{{ weekly_today(execution_date, run_id) }}'

命名错误..但是可以。