【问题标题】:Airflow DAG scheduled with a day late but manual triggers is not气流 DAG 计划延迟一天,但手动触发器不是
【发布时间】:2018-07-03 19:40:05
【问题描述】:

我使用 Airflow 1.8.0 我有一个像这样的 DAG:

default_args = {
    'owner': 'airflow',
    'depends_on_past': False,
    'email': ['technical@me.com'],
    'start_date': datetime.datetime(2018, 5, 21),
    'email_on_retry': False,
    'retries': 0
}


dag = DAG('my_dag',
          schedule_interval='40 20 * * *',
          catchup=True,
          default_args=default_args)

dag 每天都被正确安排,但迟到了一天。

鉴于今天的日期是

2018-07-02

网页界面展示:

而不是 2018-07-01

但是如果我手动触发 当前日期已正确传递:

有没有办法强制调度程序以当前日期运行?

【问题讨论】:

  • Airflow 语言中的两个日期都是正确的。手动触发器采用当前时间。计划在时间框结束时运行:“计划程序在开始日期后一个 schedule_interval 的时间段结束时运行您的作业。”。在 Airflow 文档中查看更多信息:airflow.apache.org/scheduler.html
  • 好的,谢谢,所以我不能在时间盒结束之前强制 Airflow 运行?
  • 恐怕这是不可能的。不过,您可以使用另一个日期,例如明天,请参阅 Airflow 宏:airflow.apache.org/code.html#macros

标签: airflow airflow-scheduler


【解决方案1】:

这是正确的,是气流设计的一部分。如果你看here你会看到解释:

请注意,如果您在一天的 schedule_interval 上运行 DAG,则标记为 2016-01-01 的运行将在 2016-01-01T23:59 之后不久触发。换言之,作业实例会在其涵盖的时间段结束后启动。

让我们重复一遍调度程序在开始日期后一个 schedule_interval 的时间段结束时运行您的作业。

【讨论】:

    【解决方案2】:

    您的schedule_intervalschedule_interval='20 40 * * *'。请记住,schedule_interval 是 CRON 格式,或 (Minutes Hour Day(month) Month day(week)。因此,您当前的计划实际上是不正确的,因为调度程序不能每 40 小时运行一次。你想要让它每 20 小时在第 40 分钟运行一次吗?如果是这样,试试schedule_interval='40 20 * * *'

    此外,如果您希望它在最近一天运行,请将 catchup 设置为 catchup=False。通过这两个修复程序,它应该可以工作。更多CRON帮助请参考本网站。

    【讨论】:

    • 我已经尝试过使用catchup=False(实际上我是使用参数开始工作的)我认为catchup=True 用于指定气流以从现在到最后一次成功的DAG运行之间创建缺少的DAG
    • 嘿@RonanT - 检查我最近的修订。看来您的日程安排间隔也有点偏差。您对追赶的假设也是准确的,但我总是更喜欢将其设为false,以便它在最近一天运行。您始终可以使用 start_dateend_date 创建重复的手动触发 dag 来回填您错过的日子。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-21
    相关资源
    最近更新 更多