注:
本文是根据以下两篇文章进行的总结。
https://tech.meituan.com/spark-tuning-basic.html
https://tech.meituan.com/spark-tuning-pro.html
Spark性能优化总结
1 开发调优
1.1 原则一:避免创建重复的RDD
1.2 原则二:尽可能复用同一个RDD
1.3 原则三:对多次使用的RDD进行持久化
1.4 原则四:尽量避免使用shuffle类算子
1.5 原则五:使用map-side预聚合的shuffle操作
1.6 原则六:使用高性能的算子
1.7 原则七:广播大变量
1.8 原则八:使用Kryo优化序列化性能
1.9 原则九:优化数据结构
2 资源调优
2.1 num-executors
2.2 executor-memory
2.3 executor-cores
2.4 driver-memory
2.5 spark.default.parallelism
2.6 spark.storage.memoryFraction
2.7 spark.shuffle.memoryFraction
3 数据倾斜调优
3.1 定位导致数据倾斜的代码
3.1.1 某个task执行特别慢的情况
3.1.2 某个task莫名其妙内存溢出的情况
3.2 查看导致数据倾斜的key的数据分布情况
3.3 数据倾斜的解决方案
3.3.1 使用Hive ETL预处理数据
3.3.2 过滤少数导致倾斜的key
3.3.3 提高shuffle操作的并行度
3.3.4 两阶段聚合(局部聚合+全局聚合)
3.3.5 将reduce join转为map join
3.3.6 采样倾斜key并分拆join操作
3.3.7 使用随机前缀和扩容RDD进行join
3.3.8 多种方案组合使用
4 Shuffle 调优
4.1 ShuffleManager发展概述
4.1.1 HashShuffleManager
4.1.1.1 未经优化的HashShuffleManager
4.1.1.2 优化后的HashShuffleManager
4.1.2 SortShuffleManager
4.1.2.1 普通运行机制
4.1.2.2 bypass运行机制
4.1.3 shuffle相关参数调优
4.1.3.1 spark.shuffle.file.buffer
4.1.3.2 spark.reducer.maxSizeInFlight
4.1.3.3 spark.shuffle.io.maxRetries
4.1.3.4 spark.shuffle.io.retryWait
4.1.3.5 spark.shuffle.memoryFraction
4.1.3.6 spark.shuffle.manager
4.1.3.7 spark.shuffle.sort.bypassMergeThreshold
4.1.3.8 spark.shuffle.consolidateFiles