目录
- Airflow 系统结构
1.1 单节点结构
1.2 高可用结构 - Airflow 参数调优
2.1 全局调优
2.2 DAG池
2.3 DAG调优 - Airflow 重启
- Airflow 安装目录
- Airflow 日志目录
1.Airflow 系统结构
1.1 单节点架构
1.2 多节点架构
解释:
Worker Node : 工作节点,可以理解为执行任务的节点
Scheduler : 调度节点,可以理解为安排任务的
Web Server : 网站,提供可视化作业展示,作业管理的界面
注意:
1.大家可以看到,不管是哪个模块,都会连接到数据库,所以元数据库最好放到单独的机器,调优的时候也需要考虑到数据连接池的大小
2.Worker Node 可以水平扩展,Scheduler 模块只能由一个,切记,不然会乱套
2.Airflow 参数调优
2.1 全局调优 airflow.cfg
Airflow 一般情况下不会成为性能瓶颈,出问题的大多数会是对接的执行系统,为了更好的控制流入执行系统的流量,有必要对并发的情况做一个限制,
一般情况,我们会采用 CeleryExecutor ,做为执行器, 以下调优都是针对这个场景进行
worker_concurrency :
并发的workers Executor,取决于计算机的硬件资源(一般是CPU的资源) ,数值设置在CPU核数*2 ~CPU核数*3比较好,太多会导致CPU资源过高影响别的一些工作,
数量越大,同时执行的任务越多,设置的大小不会等同于运行任务的个数,但是设置得大,同时跑得任务会变多,具体的换算关系有待考证。
关于worker,比较好的做法是设置弹性值,(如下,max 前,min 后) ,这样CPU的利用会比较弹性,任务不多的时候用最小值,大的时候慢慢增加,如下:
worker_autoscale =32,16
注意:设置了worker_autoscale ,worker_concurrency就会不起作用
parallelism
整个airflow同时运行的任务数量,包括等待的,执行的,重试的等等,其中执行中的任务与 worker_concurrency 有很大的关联,如果执行的任务达到了上限,其他的任务都会排队等待。
dag_concurrency
单个dag内允许同时执行的任务数
max_active_runs_per_dag
对同一个DAG,允许运行的最大dag数量,主要场景有,一个任务前天,昨天的任务没有跑完,今天跑任务的时间点也到了,如果设置这个值为2,那么今天这次DAG作业就不会执行
sql_alchemy_pool_size
数据库连接池的大小,根据机器配置可以适当的设置,CPU核数*2 + 磁盘个数
airflow_home
airflow目录,在/etc/profile 文件添加 (AIRFLOW_HOME=/XXXXX) ,配置文件设置是否生效有待测试
dags_folder
dag文件放置的目录,这里比较tracking 的是,需要把dag文件夹放到airflow_home目录下,不然会找不到
load_examples
是否加载测试dag,False 不加载
dags_are_paused_at_creation
是否在创建的时候终止,设置成False,代表创建就运行
dag_dir_list_interval
扫描DAG目录的时间,如果想DAG快速扫描到,设置这个时间,越短越好,以秒为单位
2.2 DAG池
在airflow中有池的概念,这样方便在dag级别控制并发的任务数,
注意:
池的大小设置受其他参数控制,设置大没有太多意义,以下是参数设置对并行任务的影响程度
parallelism > dag_concurrency > non_pooled_task_slot_count
影响最大的是 parallelism (当然其实还决定于worker_concurrency )其他依次影响。
举例如下:
如果是 parallelism = 4, dag_concurrency=100 ,non_pooled_task_slot_count = 1000 (这个就是池的slots)
在这种场景下,并行的任务就只能是4个,后面的设置其实是没有用的
如果是 parallelism = 100, dag_concurrency=3 , non_pooled_task_slot_count = 1000
这时dag_concurrency 就起作用了,一个dag最多并行跑3个任务
如果是 parallelism = 100, dag_concurrency=50,non_pooled_task_slot_count = 10
如果DAG指定池了,那么并行的任务肯定是小于10
2.3 DAG 调优
2.1,2.2 很多参数是全局性的,为了精选控制到单个DAG,我们需要在单个Dag上做一些配置,以方便资源合理利用
例如,我们指定一个DAG内它的池, 并且指定并发执行的任务是3个
default_args = {
'pool':'
backfill',
'start_date': datetime(2020,11,27,10,0,0, tzinfo=local_tz), # 开始时间
}
dag = DAG(dag_id='perform-7-args',description='for performance test 7',default_args= default_args,schedule_interval='*/4 * * * *', concurrency=3)
3. Airflow 重启
Airflow配置修改后,往往需要重启服务来达到调优的目的,因为Airflow的重启比较有个性,所以特意通过此章节来说明
重启webserver和scheduler
查找到进程并干掉: ps -ef|egrep 'scheduler|airflow-webserver'|grep -v grep|awk '{print $2}'|xargs kill -9
删除pid文件 : rm -rf /opt/airflow/airflow-scheduler.pid
启动网站: airflow webserver -p 8080 -D
启动调度: airflow scheduler -D
查看错误: tail -f /opt/airflow/airflow-scheduler.err
重启worker
查找到进程并干掉: ps -ef|egrep 'celeryd'|grep -v grep|awk '{print $2}'|xargs kill -9
删除pid文件 : rm -rf /opt/airflow/airflow-worker.pid
启动worker : airflow worker -D
查看错误:tail -f /opt/airflow/airflow-worker.err
注意:如果配置跟worker 无关,只用重启webserver 和 scheduler 即可
4.Airflow安装目录:/usr/python3/lib/python3.7/site-packages/airflow
5.Airflow日志目录:scheduler:/gwmfc/airflow/logs/scheduler
webserver:/gwmfc/airflow/logs/dag_processor_manager
任务中task的日志:/gwmfc/airflow/logs/${dag_id}/${task_id}


