【问题标题】:Airflow Why the scheduler doesn't start my DAG?Airflow 为什么调度程序不启动我的 DAG?
【发布时间】:2018-12-09 22:04:50
【问题描述】:

我有以下 Dag:

第一个带有0 1 * * * 的 Dag 运行没有任何问题。结束 DAG 0 10 1 * * 没有跑。 当我这样做时:

import datetime
print datetime.datetime.now()

我明白了:

2018-07-01 12:14:15.632812

所以我不明白为什么没有安排这个 DAG。我知道在 10:00 运行并不是强制性的,但统计数据应该是 Running

根据第一个任务的“最新运行”是2018-06-30 01:00,我怀疑我实际上并不了解 Airflow 时钟。从我的角度来看,最后一次运行是在 2018-07-01 01:00 因为它是今天早上而不是昨天运行的。

编辑: 我在documntation看到了这一段:

"请注意,如果您在一天的 schedule_interval 上运行 DAG,则标记为 2016-01-01 的运行将在 2016-01-01T23:59 之后不久触发。换句话说,作业实例在它涵盖的时期已经结束。”

所以我想知道.. 我应该把所有事情都安排在我想要的实际日期前一天吗? 所以如果我真的想在0 10 1 * * 运行一些东西,我应该把它安排到0 10 30 * * 吗?换句话说,如果我想在每个月的 1 日 10:00 运行某些东西,我应该将它安排到每个月的最后一天的 10:00 吗?

其中的逻辑在哪里?这很难理解和遵循。

它变得最糟糕,根据this 没有办法告诉调度程序这个输入。我该怎么办?!

【问题讨论】:

  • 你的开始日期是什么?

标签: airflow


【解决方案1】:

Airflow 安排任务在调度间隔的END 运行。这可能有点违反直觉,但基于这样的想法,即特定间隔的数据在该间隔结束之前不可用。

假设您有一个应该每天运行的工作流程。直到那天结束(今天),您才能获得昨天的所有数据。

在您的情况下,第一个 DAG 的最后一次运行是在昨天是有意义的,因为那是与该 DagRun 关联的“execution_date” - 您的 DAG 今天运行 昨天的数据。

如果您希望 DAG 在每个月的 1 日运行,那么更改时间表并不是一个坏主意。但是,如果您希望 DAG 为每个月 1 日关联的数据运行(即将该日期传递给 API 请求或 SQL 查询),那么您做对了。

【讨论】:

  • 对不起,但这并不能回答我的问题。我知道气流功能。我的代码需要在每个月的第一天上午 10 点运行。我没有传递任何日期参数,它只是一个需要运行的函数。气流不允许我这样做。没有可以说一个月的最后一天的 cron 表达式。您需要为此构建 3 个不同的 cron 表达式。
  • @jack 我认为您误解了“计划间隔”如果您的开始日期是 2018-06-01 并且您的计划间隔是 0 10 1 * * 那么在 2018-07-01 T 00:10:00 您将开始执行 2018-06-01 T 00:10:00跑步。 crontab.guru/#0_10_1__
  • @dlamblin 我不确定我是否理解。我的开始日期是:'start_date': datetime(2018, 06, 21) 这是我吃 DAG 的日期。
  • 因此,如果您将 start_date 设置为 6 月底,并且将间隔设置为每月运行,它将在 7 月的第一天运行,因为那是间隔(每月,从 6 月开始) 将完成。
  • 我认为这对他们来说不是一个好的决定。开发人员应该牢记这一点,并且 start_date 应该在 start_date 值的同一天开始 DAG。它们增加了隐藏的复杂性。
猜你喜欢
  • 1970-01-01
  • 2021-10-14
  • 1970-01-01
  • 1970-01-01
  • 2021-07-11
  • 1970-01-01
  • 1970-01-01
  • 2021-09-19
  • 1970-01-01
相关资源
最近更新 更多