由于执行日期和开始日期,无法运行 Airflow 任务

Posted

技术标签:

【中文标题】由于执行日期和开始日期,无法运行 Airflow 任务【英文标题】:Unable to run Airflow Tasks due to execution date and start date 【发布时间】:2018-02-22 16:18:03 【问题描述】:

每当我尝试运行 DAG 时,它都会处于运行状态,但任务不会运行。我已将开始日期设置为 datetime.today() 并将我的计划间隔设置为“* * * * *”。手动触发运行会启动 dag,但任务不会运行,原因是:

执行日期是 2017-09-13T00:00:00,但这早于任务的开始日期 2017-09-13T16:20:30.363268。

我尝试了各种计划间隔组合(例如每天的特定时间)以及等待触发 dag 和手动触发。似乎没有任何效果。

【问题讨论】:

尝试将 DAG 的开始日期硬编码为 datetime(2017, 9, 12),而不是 datetime.today()。 FAQ 对此有更多详细信息。 如果您希望手动触发,您可以通过设置 schedule_interval:none 来禁用并手动触发 dag。如果您希望它被安排,请确保 worker 和 schedular 正在运行。以下设置对我来说很好(每 2 分钟运行一次): start_date: datetime.utcnow()-timedelta(minutes=2), schedule_interval: timedelta(minutes=2) 不幸的是,我已经尝试了上述所有建议,但似乎没有任何效果。 @VinodVutpala 使用您的开始日期和间隔,我仍然得到:执行日期是 2017-09-14T00:00:00,但这是在任务的开始日期 2017-09-14T13:16:33.998064 之前。但是现在我也得到:任务实例的 dagrun 不存在:未知原因。我想知道这是否是工人问题。 【参考方案1】:

尝试重新启动调度程序,这对我有用。

【讨论】:

这个问题背后的解释是什么?【参考方案2】:

google 发给我,我遇到了和你一样的问题。我被定义为今天的start_date

'start_date': datetime.today()

当我使用较旧的日期(例如 7 天前)时,问题已解决

seven_days_ago = datetime.combine(datetime.today() - timedelta(7),
                                  datetime.min.time())
args = 
    'owner': 'airflow',
    'start_date': seven_days_ago,
    'depends_on_past': False,

我找到了这个解释Airflow Docs

【讨论】:

【参考方案3】:

首先start_date是一个任务属性;但一般情况下,它是在default_args 中设置的,和dag 属性一样使用。

消息很清楚,如果一个任务的execution_date在该任务的start_date之前,则不能调度。可以将start_date设置得更小:

import datetime

default_args = 
    'start_date': datetime.datetime(2019, 1, 1)  # hard coded date

import airflow

default_args = 
    'start_date': airflow.utils.dates.days_ago(7)  # 7 days ago

来自Airflow Documentation

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

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

因此,当您安排 dag 时,任何 dag_run 的 execution_date 都将小于其开始时间。每天会有24小时的差异。

我们可以说开始时间 = execution_date + schedule_interval (开始时间不是start_date,只是dag run的开始时间)

【讨论】:

"我们可以说开始时间 = execution_date + schedule_interval" 这意味着开始时间 > execution_date。你的意思是反过来吗?开始时间肯定是时间轴上的第一个点,所有 execution_dates 都在它之后。 我的意思是“开始时间”是“特定 dag 运行的开始时间”。示例:我有一个每日计划的 dag,有一个从 2020-11-23T00:00 开始的 dag 运行,它的 execution_date 将是 2020-11-22T00:00。公式:2020-11-23T00:00 = 2020-11-22T00:00 + 24h (schedule_interval)。换句话说:DAG 是周期性运行的,execution_date 是周期的开始,而 DAG 在周期结束时开始运行,这里是“开始时间”。 (代码中不是start_date)

以上是关于由于执行日期和开始日期,无法运行 Airflow 任务的主要内容,如果未能解决你的问题,请参考以下文章

气流回填不起作用

每月日期和时间的气流 DAG 调度

气流 - 如何获得所有未来的运行日期

具有 SSH 连接的 Airflow DAG 无法按计划同时开始运行

气流执行日期令人困惑

*** 由于未捕获的异常“NSGenericException”而终止应用程序,原因:“开始日期不能晚于结束日期!”