性能调优
环境说明
airflow版本 2.0.2
执行测试环境的执行器:Local Executor,将自带的sqlite替换成msyql数据库,可以支持并发调度
使用 airflow config get-value core executor可以查看使用的执行器
参数调整
主要对于airflow.cfg配置文件内参数进行调整,针对核心的几个参数进行说明:
- parallelism: 执行器能最大并行执行的task数量
- dag_concurrency: 一个DAG能并发执行的task数量,这个设置较低的值避免同时运行的数量太大,导致CPU使用率过高,系统响应慢
- max_active_runs_per_dag: 每个DAG能处于running状态的最大数量, 需设置较低的值避免大量任务堆积的情况
- scheduler_heartbeat_sec: 调度器执行调度的周期,对于强实时任务应设置较低的值
- parsing_processes: 解析DAG的进程的数量,在DAG比较多的时候可以设置较高
- workers 实际进行工作的进程数,设置为合理值避免worker进程过多导致cpu使用率过高
调度说明
如我的DAG创建时传递参数,如下
DAG(
dag_id=‘tutorial_’+str(i),
default_args=default_args,
description=‘A simple tutorial DAG’,
schedule_interval=timedelta(seconds=60*i + 60),
# start_date=days_ago(0, hour=23, minute=0),
start_date=timezone.utcnow().replace(minute=0),
)
其中start_date+schedule_interval就是第一个DAG执行的时间对应前端中的 Execution Date ,随后调度的时候就是使用 Execution Date 为标准每次DAG执行完之后就增加schedule_interval,当当前的时间>Execution Date时,DAG会被不停的触发调度,会不断积累调度中的DAG和并发执行的task,其调度周期不满足设置的schedule_interval周期。
所以创建DAG时,设置start_date应该恰好设置为当前时间-schedule_interval的相近时间,这样在airflow迅速补完欠缺的运行次数后,Execution Date更新至未来的时间点,就会在当前时间到达未来的时间点后迅速调度(前提是调度器未挂的情况下),使得调度时间周期满足设置的周期。
注: start_date+schedule_interval 不能是未来的时间,否则每次解析DAG时,都无法触发DAG。同时在第一次使用 start_date+schedule_interval 作为Execution Date后,新的DAG的Execution Date都在原来的基础上增加schedule_interval