优化思路:
我认为性能优化首先的前提是程序没有错,尤其是没有oom的前提下,才能谈性能优化,从而让程序运行的快速、高效。那么现一、在谈谈怎么避免oom的几个方案:
解决的核心特点就是1.增大内存 2.减少任务内存的使用率
对于增大内存方案:
1减少worker上executor的数量 (这样每个executor占用的内存就大了)
2.设置spark.stage.memoryFraction
对于减少任务对内存的使用率方案:
1.减少executor上的core数量 (并行的任务少了,内存的占用就少了)
2.
二、优化
硬件
1.处理的spark job 的过程如果出现特别多的小文件,这个时候就可以用colesce来减少partition的数量,进而减少并行运算的task的数量来减少任务的开辟,也就是减少频繁的切换任务的执行(cpu),从而提升硬件的使用率
2.partition的设置很重要:partition过少,每个partition数据过大导致oom以及频繁的gc
partition过多,每个partition数据过小,导致执行率底下(频繁切换task)
3处理spark job的时候如果发现某些任务task运行的特别慢,方法一针对性的处理(数据倾斜),方法二考虑增加任务的并行度,减少每个partition的数据量来提升执行效率。可以尝试打开spark.speculation(任务推测 就是把相同任务在别的机子运行,当有一个完成,会杀掉其他相同的任务,以第一个完成的任务为时间) 方法三增加executor的个数提高并行