Airflow 如何制作需要处理今天数据的DAG?

Airflow 如何制作需要处理今天数据的DAG?,airflow,airflow-scheduler,Airflow,Airflow Scheduler,我有一个每天晚上7:30开始的DAG。它需要处理位于/data/yyyy-mm-dd/目录中的文件。yyyy mm dd是同一天 如果我使用execution_date+timedelta(day=1),它在调度程序运行DAG时工作。但当我使用回填命令时,这会中断(我必须给它2019-01-01才能运行2019-01-02) 有没有更好的方法来实现这一点?您的问题听起来有点混淆了反填充的执行日期。“回填”命令要求您指定运行DAG的备用开始和结束日期。然后,它使用schedule\u interv

我有一个每天晚上7:30开始的DAG。它需要处理位于/data/yyyy-mm-dd/目录中的文件。yyyy mm dd是同一天

如果我使用execution_date+timedelta(day=1),它在调度程序运行DAG时工作。但当我使用回填命令时,这会中断(我必须给它2019-01-01才能运行2019-01-02)


有没有更好的方法来实现这一点?

您的问题听起来有点混淆了反填充的执行日期。“回填”命令要求您指定运行DAG的备用开始和结束日期。然后,它使用
schedule\u interval
计算在该范围内运行的运行,并将其
执行日期传递给它们

因此,您的
时间表\u间隔
可能看起来像
3019***
。如您所知,您的跑步将在该时间间隔结束时通过该时间间隔的开始,因此2019-01-01T19:30:00.000的计划执行日期将被触发,以在2019-01-02T19:30:00.000之后开始。在那个时候,您似乎希望作业拾取降落在
/data/2019-01-02/
中的数据,这就是为什么要在
执行日期
中添加一天,并将其格式化为源日期

如果你正在使用,它应该以同样的方式运行(而不是改变时间)。因此,给定
-s 2019-01-01-e 2019-01-02
它将回填2019-01-02T19:30:00.000之后触发的运行,执行日期为2019-01-01T19:30:00.000,不是吗

至于其他方法:

  • 您可以将跑步时间移到午夜,让他们使用
    执行日期中的日期。但是4.5小时的延迟可能不是你想要的
  • 你看,如果数据目录可以被命名为不同的名称,我怀疑如果有其他人或工作依赖于它们,这将是好的
  • 气流还有一个
    next\u execution\u date
    ,它基本上会给您提供与在
    execution\u date
    中添加一天相同的结果。但是您可能需要格式化的
    {{next_ds}}
    来满足您的需要

您的问题听起来有点混淆了反写的执行日期。“回填”命令要求您指定运行DAG的备用开始和结束日期。然后,它使用
schedule\u interval
计算在该范围内运行的运行,并将其
执行日期传递给它们

因此,您的
时间表\u间隔
可能看起来像
3019***
。如您所知,您的跑步将在该时间间隔结束时通过该时间间隔的开始,因此2019-01-01T19:30:00.000的计划执行日期将被触发,以在2019-01-02T19:30:00.000之后开始。在那个时候,您似乎希望作业拾取降落在
/data/2019-01-02/
中的数据,这就是为什么要在
执行日期
中添加一天,并将其格式化为源日期

如果你正在使用,它应该以同样的方式运行(而不是改变时间)。因此,给定
-s 2019-01-01-e 2019-01-02
它将回填2019-01-02T19:30:00.000之后触发的运行,执行日期为2019-01-01T19:30:00.000,不是吗

至于其他方法:

  • 您可以将跑步时间移到午夜,让他们使用
    执行日期中的日期。但是4.5小时的延迟可能不是你想要的
  • 你看,如果数据目录可以被命名为不同的名称,我怀疑如果有其他人或工作依赖于它们,这将是好的
  • 气流还有一个
    next\u execution\u date
    ,它基本上会给您提供与在
    execution\u date
    中添加一天相同的结果。但是您可能需要格式化的
    {{next_ds}}
    来满足您的需要

你好,Daniell,谢谢你的详细回答。我认为这符合我的思维模式。我不喜欢的是:要处理2019-01-02的数据,我必须使用-s 2019-01-01运行回填。这是令人困惑的,并且可能容易出错。我可以想象处理这个问题的一种方法是通过检测我是按计划运行还是通过回填运行,但是dag_run.external_触发器没有检测到回填的作业。@boriska这是一种黑客行为,但是…theo操作员的
上下文
任务实例
可以获得自己的
DagRun
,它可以获得自己的
运行id
(或使用属性
is\u backfill
)。计划运行从
的“计划的”
开始,手动触发运行从
的“手动”
开始,回填作业从
的“回填”开始
你好,Daniell,谢谢你提供的详细答案。我认为这符合我的思维模式。我不喜欢的是:要处理2019-01-02的数据,我必须使用-s 2019-01-01运行回填。这很混乱,而且可能容易出错。我可以想象处理这一问题的一种方法是检测我是按计划运行还是通过回填运行,但dag_run.external_触发器不会检测到已回填的作业。@boriska这是一种黑客行为,但是…theo运算符的
上下文
任务实例
可以获取自己的
DagRun
,该触发器可以获取自己的
运行id
(或使用属性
is_backfill
)。计划运行从
计划运行开始
,手动触发的作业使用
“手动”
和回填作业使用
“回填”