上一期,我讲了软件性能优化必须经过进行性能测试,并在了解软件架构和技术的基础上进行。今天,我们通过几个 Spark 性能优化的案例,看一看所讲的性能优化原则如何落地。如果你忘记了性能优化的原则,可以返回上一期复习一下。
基于软件性能优化原则和 Spark 的特点,Spark 性能优化可以分解为下面几步。
1. 性能测试,观察 Spark 性能特性和资源(CPU、Memory、Disk、Net)利用情况。
2. 分析、寻找资源瓶颈。
3. 分析系统架构、代码,发现资源利用关键所在,思考优化策略。
4. 代码、架构、基础设施调优,优化、平衡资源利用。
5. 性能测试,观察系统性能特性,是否达到优化目的,以及寻找下一个瓶颈点。
下面我们一起进入详细的案例分析,希望通过这几个案例,可以帮助你更好地理解 Spark 的原理,以及性能优化如何实践落地,希望能对你有所启发。
案例 1:Spark 任务文件初始化调优
首先进行性能测试,发现这个视频图谱 N 度级联关系应用分为 5 个 job,最后一个 job 为保存结果到 HDFS,其余 job 为同样计算过程的反复迭代。但是发现第一个 job 比其他 job 又多了个计算阶段 stage,如图中红圈所示。
通过阅读程序代码,发现第一个 job 需要初始化一个空数组,从而产生了一个 stage,但是这个 stage 在性能测试结果上显示,花费了 14 秒的时间,远远超出合理的预期范围。同时,发现这段时间网络通信也有一定开销,事实上只是内存数据初始化,代码上看不出需要进行网络通信的地方。下图是其中一台计算节点的通信开销,发现在第一个 stage,写通信操作几乎没有,读通信操作大约每秒几十 MB 的传输速率。