基于软件性能优化原则和 Spark 的特点,Spark 性能优化可以分解为下面几步。
- 性能测试,观察 Spark 性能特性和资源(CPU、Memory、Disk、Net)利用情况。
- 分析、寻找资源瓶颈。
- 分析系统架构、代码,发现资源利用关键所在,思考优化策略。
- 代码、架构、基础设施调优,优化、平衡资源利用。
- 性能测试,观察系统性能特性,是否达到优化目的,以及寻找下一个瓶颈点。
案例 1:Spark 任务文件初始化调优
同一台服务器上的多个 Executor 进程不必每个都通过网络下载应用程序,只需要一个进程下载到本地后,其他进程将这个文件 copy 到自己的工作路径就可以了。
案例 2:Spark 任务调度优化
避免任务在每个worker服务器上分配不均匀。
案例 3:Spark 应用配置优化
看案例 2 的几张 CPU 利用率的图,我们还发现所有 4 个 Worker 服务器的 CPU 利用率最大只能达到 60% 多一点。例如下图,绿色部分就是 CPU 空闲。
这种资源利用瓶颈的分析无需分析 Spark 日志和源代码,根据 Spark 的工作原理,稍加思考就可以发现,当时使用的这些服务器的 CPU 的核心数是 48 核,而应用配置的最大 Executor 数目是 120,每台服务器 30 个任务,虽然 30 个任务在每个 CPU 核上都 100% 运行,但是总的 CPU 使用率仍只有 60% 多。具体优化也很简单,设置应用启动参数的 Executor 数为 48×4=192 即可。
案例 4:操作系统配置优化
在性能测试过程中发现,当使用不同服务器的时候,CPU 资源利用情况也不同,某些服务器的 CPU 处于 sys 态,即系统态运行的占比非常高,如下图所示。
图中紫色为 CPU 处于 sys 态,某些时候 sys 态占了 CPU 总使用率的近 80%,这个比例显然是不合理的,表示虽然 CPU 很忙,但是没有执行用户计算,而是在执行操作系统的计算。
那么,操作系统究竟在忙什么,占用了这么多 CPU 时间?通过跟踪 Linux 内核执行指令,发现这些 sys 态的执行指令和 Linux 的配置参数 transparent huge pages 有关。当
transparent huge pages 打开的时候,sys 态 CPU 消耗就会增加,而不同 Linux 版本的 transparent huge pages 默认是否打开是不同的,对于默认打开 transparent huge pages 的 Linux 执行下面的指令,关闭 transparent huge pages。
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/ transparent_hugepage/defrag
关闭以后,对比前面的 CPU 消耗,sys 占比明显下降,总的应用耗时也有明显下降。
案例 5:硬件优化
分析网卡的资源消耗,发现网络通信是性能的瓶颈,对整个应用的影响非常明显。比如在第二个、第三个 job,网络通信消耗长达 50 秒的时间,网络读写通信都达到了网卡的最大吞吐能力,整个集群都在等待网络传输。
我们知道千兆网卡的最大传输速率是每秒 125MB,这样的速率和 CPU 内存固然没法比,而虽然比单个磁盘快一些,但是服务器磁盘是 8 块磁盘组成的阵列,总的磁盘吞吐量依然碾压千兆网卡,因此网卡传输速率的瓶颈就成为整个系统的性能瓶颈。
而优化手段其实很简单粗暴,就是升级网卡使用万兆网卡。
硬件优化的效果非常明显,以前需要 50 多秒的网络通信时间,缩短为 10 秒左右。从性能曲线上看,网络通信在刚刚触及网卡最大传输速率的时候,就完成了传输,总的计算时间缩短了近 100 秒。
小结
一般说来,大数据软件性能优化会涉及硬件、操作系统、大数据产品及其配置、应用程序开发和部署几个方面。当性能不能满足需求的时候,先看看各项性能指标是否合理,如果资源没有全面利用,那么可能是配置不合理或者大数据应用程序(包括 SQL 语句)需要优化;如果某项资源利用已经达到极限,那么就要具体来分析,是集群资源不足,需要增加新的硬件服务器,还是需要对某项硬件、操作系统或是 JVM,甚至是对大数据产品源代码进行调优。
思考题
关于目前的主要大数据产品,你在学习、使用过程中,从 SQL 写法、应用编程、参数配置,到大数据产品自身的架构原理与源码实现,你有没有发现有哪些可以进行性能优化的地方?
来自极客时间的精选留言
大神1
我们公司集群作业最多的就是SQL作业约占80%,不管是hive SQL还是spark SQL,presto的SQL引擎都不是完美的,执行任务都有可能卡住99%就不动了。优化业务逻辑,SQL的写法是关键,减少重复计算,共用中间结果,还要有分区表的感念。
大神2
在第二个案例中说到,先注册的Executor可能会认领全部的任务,也就是说其所在的物理机会把那个stage的全部工作都做了吗?但是本着“移动计算比移动数据更划算的理论”,如果所有的任务都在一台机器上做岂不是会导致数据的移动?不知道我的理解有没有错哈
作者回复: 是的,数据会有更多移动
该笔记摘录自极客时间课程
《从0开始学大数据》