Airflow调度器在安排后续任务时速度较慢

27

当我尝试在Airflow 1.8.0中运行DAG时,我发现完成前置任务和选择后继任务执行之间需要很长时间(通常大于单个任务的执行时间)。对于Sequential、Local和Celery Executors来说情况也是如此。是否有办法减少以上提到的开销时间?(比如airflow.cfg中的任何参数可以加速DAG的执行吗?)参考甘特图如下:

Gantt chart

1
你的配置文件中 scheduler_heartbeat_sec 是多少?也许你可以尝试减少它。 - Chengzhi
只是好奇——您还记得在展示甘特图中使用了哪个执行器来处理数据吗?我会预期LocalExecutor和CeleryExecutor在涉及多个节点时看起来会有所不同。 - Taylor D. Edmiston
我还不确定原因,但在1.10.7版本(以及可能的1.10.7+版本)中,使用LocalExecutor时,任务之间的时间大致对应于“min_file_process_interval”设置中的秒数。也许可以尝试缩短该设置? - Marco
2个回答

36

正如Nick所说,Airflow并不是实时工具。任务被安排并尽快执行,但下一个任务永远不会立即在上一个任务之后运行。

当您有100个以上的DAG,每个DAG中有3个任务或者有许多任务的DAG(100个或更多)时,您必须考虑以下三件事:

  1. 增加DagFileProcessorManager将用于加载和执行Dags的线程数(airflow.cfg):

[scheduler]

max_threads = 2

max_threads控制选择和执行/终止的DAG数量(在这里查看)。增加此配置可以减少任务之间的时间。

  1. 监视您的Airflow数据库以查看是否存在瓶颈。Airflow数据库用于管理和执行进程:

最近,我们也遇到了同样的问题。任务之间的时间大约是10-15分钟,我们正在使用AWS上的PostgreSQL。

实例没有很好地利用资源; ~20 IOPS、20%的内存和~10%的CPU,但Airflow非常慢。

在使用PgHero查看数据库性能后,我们发现即使在小表上使用索引的查询也需要超过一秒钟。

因此,我们增加了数据库大小,现在Airflow像火箭一样快。 :)

  1. 要获取Airflow加载Dags所花费的时间,请运行以下命令:

airflow list_dags -r

DagBag parsing time: 7.9497220000000075

如果DagBag解析时间超过~5分钟,则可能存在问题。

所有这些都帮助我们更快地运行Airflow。我强烈建议您升级到1.9版本,因为该版本修复了许多性能问题。

顺便说一句,我们在生产中使用Airflow主节点,使用LocalExecutor和PostgreSQL作为元数据数据库。


此外,我编写了一个DAG缓存机制,可以将DAG缓存在Redis中,以便长时间运行的DAG包导入。另一个需要审查的是DAG生成的代码,并确保您在其中不做除定义DAG之外的任何事情。让任务实例处理其他事情。 - Nick
3
我认为有些事情非常奇怪:在运行回溯操作时,即使我有一个简单的DagBag可以在0.05秒内解析完成,任务之间也需要40秒钟的时间。Airflow在这40秒钟内在做什么?我的情况是:我有一些快速作业,下载历史货币汇率数据,每天创建一个文件。我想回溯数年。该任务运行需要4秒钟。Airflow在任务之间需要40秒钟,所以这个顺序回溯中的计算大部分都是浪费的时间;本应花费几个小时的时间,现在却需要几天!请注意,我无法使用任务并行性,否则我的IP将被封锁。 - eraoul
我很想看到你的问题的答案。我们在进行大量数据回填时也遇到了类似的问题。我们的dagbag也可以在瞬间解析完成。 - grackkle
1
我大约3年前问过这个问题。这些年来,延迟已经减少了。我认为在Airflow 2中它将被显著缩短。https://www.element61.be/en/resource/whats-changing-airflow-20 - Prasann
我知道这是一个旧的帖子,但还是要问一下,当你说你增加了数据库的大小,你是指的是Postgres吗? - undefined
显示剩余2条评论

3

您的甘特图以秒为单位显示事情。Airflow不是旨在成为实时调度引擎。它处理的是以分钟为单位的事情。 如果您需要运行速度更快的工具,可以考虑使用与Airflow不同的调度工具。或者,您可以将所有工作放入单个任务中,这样您就不会遭受调度程序延迟的影响。


1
嗨,@Nick。你能说出一些提供实时调度的工具吗? - Robert Lugg
1
嗨@RobertLugg - 不幸的是,我还没有对替代方案进行过多的研究。我们的组织目前仍在使用airflow。有许多替代方案,但我认为作业的抽象级别会有所变化...有mesos、conductor(Netflix)、Luigi等,我不确定哪些更实时。 - Nick
1
Airflow是建立在Celery之上的。为了减少任务之间的时间,您可以直接在Celery之上构建ETL管道平台。有很多技术文档/博客围绕这个主题,您应该能够轻松找到它们。 - sudeepgupta90
3
Airflow并非建立在Celery之上,但它允许使用Celery作为其任务执行器。根据OP所想要处理的任务复杂程度,你可能无意中建议构建一个全新的Airflow...这是一项巨大的任务。如果Airflow的性能不能满足手头问题的要求,最好找到另一个框架并使用它。考虑到数百个配置选项、管理UI和错误处理,这些都已经为您处理好了。 - Nick

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