分析|Airflow任务调度延时问题分析和优化

分析|Airflow任务调度延时问题分析和优化
文章插图
作者 |高光轩
编辑 | 高卫华
出品 | CSDN(ID:CSDNnews)
背景
airflow作为apache基金会的一款开源的优秀调度系统,目前被国内外很多大中型企业使用;其丰富的算子(operator)类型和极易扩展的支持,被很多企业进行相关的自定义改造和二次开发以满足自身的业务需求。
但是我们不难发现几个问题,随着用户脚本(dag文件)和工程目录数量越来越多,我们可能面临整任务出现了延时调度的现象。
举个例子说明下,假设你设置了一个任务是每天8:00跑,但是你发现到了调度的时候延时到了8:02或者某个DAG上游节点调度完毕后,下游节点需要等很久才能得到调度。
今天我们就针对这个问题进行相关的分析并提出几点相关的优化建议。
针对以上存在的问题,我认为可以从以下几个方面对airflow的调度延时问题进行分析和优化,后面我们将对每个部分进行相关的介绍。
分析|Airflow任务调度延时问题分析和优化
文章插图
延时调度问题几个思考的方向
dag的解析逻辑对延时的影响
在定位问题前,我认为了解airflow源码dag(有向无环图,工作流的描述关系)文件工作原理能够使我们更好的定位分析问题,在airflow源码中有两个函数和dag文件的加载扫描有直接关系。
一个函数叫做:list_py_file_paths;一个叫做:process_file。从字面可以看出,list_py_file_path主要是用来收集整个dag目录下的所有py文件,process_file主要是用来处理目录下的文件。
针对list_py_file_path的逻辑,我们只需要关注这几行(部分源码省略):
分析|Airflow任务调度延时问题分析和优化
文章插图
我们重点分析下process_file这个函数的逻辑分析。
整个代码的逻辑并不复杂,由于代码比较多,这里我只简单的介绍下它的工作原理,以及相关的处理方案。process_file函数主要用来处理AIRFLOW_HOME(环境变量)目录下的文件。
目前对于airflow而言支持处理两种类型的文件加载(python文件和zip文件),其他类型会做过滤。在整个处理过程中有两个地方其实是比较耗时的。如下:
分析|Airflow任务调度延时问题分析和优化
文章插图
所以通过以上分析我们可以得到两点优化建议:
在编写python dag脚本中,应特别注意规范。应避免大量的计算操作,如果存在不合理的耗时逻辑,那么在加载dag文件的时候,就会执行函数内部执行逻辑运算。
【 分析|Airflow任务调度延时问题分析和优化】比如我在dag文件里面写了一个函数,然后直接调用函数,函数内部的逻辑是sleep操作,那么在dag文件大量加载的时候,一轮的调度扫描下来,将会花费大量的时间。甚至导致超时异常,导致scheduler异常。这点要尤其注意,所以dag编写规范特别重要。

【精彩生活】jing111.com小编为您精选以下内容,希望对您有所帮助: