Airflow:为什么运营商有 start_date?

Airflow: Why is there a start_date for operators?

我不明白为什么我们需要 'start_date' 操作员(任务实例)。我们传递给 DAG 的那个还不够吗?

此外,如果当前时间是 UTC 时间 2018 年 2 月 7 日上午 8 点半,现在我将 dag 的 start_date 设置为 2018 年 2 月 7 日上午 0 点,我的 cron 表达式的计划间隔为 30 9 * * *(每天上午 9 点 30 分,即预计在接下来的 1 小时内 运行)。我的 DAG 运行 是今天上午 9 点还是明天(2 月 8 日上午 9 点)?

关于 start_date 任务实例,我个人从未使用过它,我总是只有一个 DAG start_date。

但是据我所知,这将允许您指定某些任务在与主 DAG 不同的时间开始。看来这是一项遗留功能,通过阅读常见问题解答,他们建议对此类事物使用时间传感器,并且只为通过 DAG 传递的所有任务设置一个 start_date。

你的第二个问题:

运行 的执行日期始终是根据您的日程安排的前一个时期。

来自文档 (Airflow Docs)

Note that if you run a DAG on a schedule_interval of one day, the run stamped 2016-01-01 will be trigger soon after 2016-01-01T23:59. In other words, the job instance is started once the period it covers has ended.

澄清一下:

  • 如果设置为每日计划,则在 8 号执行 7 号。
  • 如果将每周计划设置为运行星期日,则本星期日的执行日期为上星期日。

一些复杂的要求可能需要在任务级别进行特定的计时。例如,我可能希望我的 DAG 在某个聚合日志记录任务开始 运行 之前整周每天 运行,因此为了实现这一点,我可以在任务级别设置不同的开始日期。

更多有用的信息...查看气流 DAG class 源似乎在 DAG 级别设置 start_date 仅仅意味着它被传递到当没有通过 default_args 字典将任务 start_date 的默认值传递给 DAG 时,或者在每个任务级别上没有定义特定 start_date 时的任务。因此,对于您希望 DAG 中的所有任务同时启动的任何情况(依赖关系除外),在 DAG 级别设置 start_date 就足够了。

只是为了添加到这里已有的内容。依赖于另一个任务的任务的开始日期必须 >= 到其依赖项的开始日期。

例如:

  • 如果task_a取决于task_b
  • 你不能有
    • task_a start_date = 2019 年 1 月 1 日
    • task_b start_date = 2019 年 1 月 2 日
    • 否则,task_a 将不会 运行 在 2019 年 1 月 1 日启用,因为 task_b 不会 运行 在该日期启用,您无法将其标记为完成或者

你为什么要这个?

  • 我会喜欢这个任务逻辑,它是一个等待另一个 dag 完成的外部任务传感器。但是另一个 dag 的开始日期在当前 dag 之后。因此,在另一个 dag 不存在的日子里,我不希望存在依赖关系

很可能没有设置任务的 dag 参数,如下所述: