Spark性能优化:开发调优、资源调优、数据倾斜调优、shuffle调优
开发调优
- 避免重复创建RDD
- 复用同一个RDD
- 对多次使用的RDD进行持久化
- 尽量避免使用shuffle类算子——broadcast+map代替join
- 使用map-side预聚合的shuffle操作——reduceByKey代替groupByKey
- 高性能算子
- 广播大变量
- Kyro优化序列化性能
- 优化数据结构——Spark官方建议尽量使用字符串代替对象,原始类型代替字符串,数组代替集合类型,减少内存占用
资源调优
- num-executors——设置Spark作业总共有多少个Executor进程
- executor-memory——每个Executor进程内存的大小
- executor-cores——每个Executor进程的CPU core数量——决定每个Executor进程并行执行task的能力
- driver-memory
- spark.storage.memoryFraction——设置RDD持久化数据在Executor内存中所占比例(默认0.6)——根据shuffle类操作,持久化操作,gc性能动态调整
- spark.shuffle.memoryFraction——shuffle过程当前task拉取到上一个stage的task的输出,进行聚合操作时能够使用的Executor内存的比例(默认0.2)——shuffle时数据多,内存不够,溢出到磁盘
- spark.default.parallelism——设置每个stage默认task数量——若不设置,task数量由HDFS的block数量决定