出于某种原因,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
由于调度程序应回填7 / 18,7 / 25,8 / 1和8/8,因此您预计共有四次DAG运行。 但是,最后一次运行没有安排。
编辑1:
我理解Vineet虽然似乎没有解释我的问题。
在上面的例子中,DAG的开始日期是7月18日。
每个DAG Run处理前一周的数据。
今天是8月9日,我预计第四次DAG运行的执行日期为8月8日,处理上周(8月1日至8月8日)的数据,但事实并非如此。
答案 0 :(得分:3)
Airflow始终安排前一时段。因此,如果你有一个计划每天运行的dag,8月9日,它将安排在8月8日执行execute_date。类似地,如果计划间隔是每周一次,那么在8月9日,它将安排返回1周,即8月2日,尽管这将在8月9日运行。这只是气流簿记。你可以在气流维基(https://cwiki.apache.org/confluence/display/AIRFLOW/Common+Pitfalls)中找到它:
了解执行日期 Airflow是作为ETL需求的解决方案而开发的。在ETL世界中,您通常会汇总数据。所以,如果我想总结2016-02-19的数据,我会在格林威治标准时间2016-02-20午夜进行,这将在2016-02-19的所有数据可用之后。 这个日期可以在Jinja和Python callable的上下文中以多种形式提供给您,如此处所述。作为注释,ds指的是date_string,而不是日期开始,因为可能会让某些人感到困惑。
答案 1 :(得分:0)
类似的问题也发生在我身上。
我通过手动运行解决了它
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
答案 2 :(得分:0)
我这几天在学习apache气流时也遇到了类似的问题。
我认为正如 Vineet 所解释的,鉴于 airfow 的工作方式,您可能应该将执行日期用作DAG 执行的开始,而不是DAG 执行的结束强>正如你在下面所说的。
<块引用>我理解 Vineet,尽管这似乎不能解释我的问题。
在我上面的示例中,DAG 的开始日期是 7 月 18 日。
第一次 DAG 运行:7 月 18 日 第二次 DAG 运行:7 月 25 日 第三次 DAG 运行:8 月 1 日 第四次 DAG 运行:8 月 8 日(未运行)
每个 DAG Run 从哪里处理数据 上周。
为了使其工作,您可能应该使用,例如,7 月 18 日作为 7 月 18 日至 7 月 22 日这一周 DAG 执行的开始日期,而不是结束日期7 月 11 日至 7 月 15 日这一周的 DAG 执行。