如何防止空气流动回填DAG运行?

77

假设您有一个Airflow DAG,不适合回溯填充(backfill),这意味着在它运行一次后,快速地连续运行它将完全是无意义的。

例如,如果您正在从某个仅每小时更新一次的源加载数据到数据库中,那么回溯填充将只是一遍又一遍地导入相同的数据。

当您实例化一个新的每小时任务时,这将特别烦人,因为它会错过N次每小时运行,并且会做冗余工作,然后才开始按您指定的间隔运行。

我能想到的唯一解决方案是他们明确反对的文档的FAQ中的某些内容:

我们建议不要使用动态值作为start_date,尤其是datetime.now(),因为它可能非常令人困惑。

是否有任何方法可以禁用DAG的回溯填充,还是我应该执行上述操作?


我正在为这个问题苦苦挣扎,Airflow总是在手动运行后立即启动后续的DAG运行。我已经设置了catchup=False,但似乎airflow总是触发当前时间间隔的计划运行,而我不想要这样,我只想执行未来的时间间隔。有人有什么想法吗? - thedevd
3个回答

81

8
我已将catchup_by_default设置为False,但Airflow仍在回溯任务。有任何想法是为什么吗?我正在运行1.8版。 - Ollie Glass
4
@Nick,实际上我也无法让默认设置运行起来,所以最终我只是在所有的DAG上加了catchup=False,像这样:DAG('example', default_args=default_args, schedule_interval='0 5 * * *', catchup=False) - m0meni
12
@Nick 默认参数对象包含应用于DAG下运行的任务而不是DAG本身的参数。我最初也感到困惑。 - m0meni
3
我正在使用Airflow v1.10.0版本,但仍然遇到此问题。 - harveyxia
4
我也有同样的问题,在Airflow 1.10.1上。我在所有的DAG上设置了catchup=False,但仍然得到回溯执行。 - flinz
显示剩余14条评论

20
在你的dag声明中设置catchup=False将提供这个精确的功能。我没有"声望"来评论,但我想说catchup=False是为了这个特定目的而设计的(由我)。此外,我可以验证,在1.10.1版本中,当在实例化中显式设置时,它是有效的。然而,当放置在默认参数中时,我没有看到它起作用。不过我已经离开Airflow有18个月了,所以在我看来,要看一看为什么默认参数在catchup方面不起作用还需要一点时间。
dag = DAG('example_dag',
        max_active_runs=3,
        catchup=False,
        schedule_interval=timedelta(minutes=5),
        default_args=default_args)

2
我正在运行 airflow 1.10.14,但至少在使用 DebugExecutor 时无法正常工作。 - cosbor11
使用Airflow 1.10.12仍然无法正常运行。 - Prathamesh dhanawade
刚刚看到默认情况下catchup_by_default是一个字符串,设置为True,而不是布尔值。不确定这是否有问题!https://airflow.apache.org/docs/apache-airflow/1.10.12/configurations-ref.html#catchup-by-default 我们能否将其默认设置为False,因为很多人不需要/有问题关闭它。 - Prathamesh dhanawade

15
这似乎是一个未解决的Airflow问题。我知道我真的很想拥有完全相同的功能。这是我所达到的程度;它可能对其他人有用。 至少在1.7.1.3中,有一些UI功能可以帮助解决此问题。如果您转到Tree视图并单击特定任务(方形框),则将出现一个带有“标记成功”按钮的对话框按钮。单击“过去”,然后单击“标记成功”将标记DAG中该任务的所有实例为成功,并且它们不会运行。顶级DAG(顶部的圆圈)也可以以类似的方式标记为成功,但似乎没有办法标记多个DAG实例。

我还没有深入研究过,但可能可以使用“trigger_dag”子命令来标记DAG的状态。请看这里:https://github.com/apache/incubator-airflow/pull/644/commits/4d30d4d79f1a18b071b585500474248e5f46d67d

正在开发一项标记DAG的CLI功能: http://mail-archives.apache.org/mod_mbox/airflow-commits/201606.mbox/%3CJIRA.12973462.1464369259000.37918.1465189859133@Atlassian.JIRA%3E https://github.com/apache/incubator-airflow/pull/1590

更新(2016年9月28日): 添加了一个新的操作符“LatestOnlyOperator”(https://github.com/apache/incubator-airflow/pull/1752),它只会运行下游任务的最新版本。听起来非常有用,希望它能尽快进入发布版

更新2:截至airflow 1.8,LatestOnlyOperator已发布。


更新看起来非常有前途!感谢您对问题的持续关注。 - m0meni
2
请注意,LatestOnlyOperator会将下游任务设置为“跳过”状态。根据文档,跳过状态会传播,以至于所有直接上游任务也都被跳过。这使得该方法不适用于希望上游作业在使用过时数据的情况下成功运行的情况。在这种情况下,最好的解决方案是在代码中添加一个早期操作符,如果任务运行特别晚,则跳转到成功状态。 - russellpierce
1
命令行界面的回填命令似乎已经可用,并且可能是目前最好的方法。https://airflow.incubator.apache.org/cli.html airflow backfill -h [此处输入主机名] -m=True -s [开始日期] -e $(date +"%Y-%m-%dT:%H:%M:%S") - sage88
我尝试了回填标记成功脚本的技巧,但它实际上无法停止所有正在运行的任务/防止回填(至少在1.8中)。希望在未来的版本中能够解决。通过UI手动执行可以解决问题,但如果你要处理大量的回填任务,那就不太可行了。 - szeitlin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,