气流不回填最新 运行

Airflow does not backfill latest run

出于某种原因,Airflow 似乎不会触发具有每周计划间隔的 dag 的最新 运行。

当前日期:

$ date
$ Tue Aug  9 17:09:55 UTC 2016

DAG:

from datetime import datetime
from datetime import timedelta

from airflow import DAG
from airflow.operators.bash_operator import BashOperator

dag = DAG(
    dag_id='superdag',
    start_date=datetime(2016, 7, 18),
    schedule_interval=timedelta(days=7),
    default_args={
        'owner': 'Jon Doe',
        'depends_on_past': False
    }
)

BashOperator(
    task_id='print_date',
    bash_command='date',
    dag=dag
)

运行 调度器

$ airflow scheduler -d superdag

您预计总共有四个 DAG 运行,因为调度程序应该回填 7/18、7/25、8/1 和 8/8。 但是,最后一个运行没有安排。

编辑 1:

我理解 Vineet,虽然这似乎不能解释我的问题。

在我上面的示例中,DAG 的开始日期是 7 月 18 日。

其中每个 DAG 运行 处理上周的数据。

今天是 8 月 9 日,我预计第四个 DAG 运行 已执行,执行日期为 8 月 8 日,它处理上周(8 月 1 日至 8 月 8 日)的数据,但事实并非如此。

Airflow 总是安排在前一段时间。因此,如果您有一个计划在 8 月 9 日每天 运行 的 dag,它将在 8 月 8 日安排 运行 和 execution_date。类似地,如果计划间隔是每周一次,那么在 8 月 9 日,它将计划回溯 1 周,即 8 月 2 日,尽管这会在 8 月 9 日本身得到 运行。这只是气流簿记。您可以在气流维基 (https://cwiki.apache.org/confluence/display/AIRFLOW/Common+Pitfalls) 中找到它:

Understanding the execution date Airflow was developed as a solution for ETL needs. In the ETL world, you typically summarize data. So, if I want to summarize data for 2016-02-19, I would do it at 2016-02-20 midnight GMT, which would be right after all data for 2016-02-19 becomes available. This date is available to you in both Jinja and a Python callable's context in many forms as documented here. As a note ds refers to date_string, not date start as may be confusing to some.

我也遇到了类似的问题。 我手动解决了运行 airflow backfill -s start_date -e end_date DAG_NAME 其中 start_date 和 end_date 覆盖了缺失的 execution_date,在您的例子中是 2016-08-08。 例如, airflow backfill -s 2016-08-07 -e 2016-08-09 DAG_NAME

我这几天在学习apache airflow的时候也遇到了类似的问题

我认为正如 Vineet 所解释的那样,鉴于 airfow 的工作方式,您可能应该将执行日期用作 DAG 执行的开始,而不是 DAG 执行结束 如下所述。

I understand that Vineet although that doesn’t seem to explain my issue.

In my example above, the DAG’s start date is July 18.

First DAG Run: July 18 Second DAG Run: July 25 Third DAG Run: Aug 1 Fourth DAG Run: Aug 8 (not run)

Where each DAG Run processes data from the previous week.

要使其正常工作,您可能应该使用,例如,7 月 18 日作为 7 月 18 日至 7 月 22 日这一周 DAG 执行的开始日期,而不是 7月11日至7月15日这一周的DAG执行结束这一周