Spark优化
2019-02-08
详细内容参见参考文献——美团技术博客中的总结。
1 开发调优
- 原则一:避免创建重复的RDD
- 原则二:尽可能复用同一个RDD
- 原则三:对多次使用的RDD进行持久化
- 原则四:尽量避免使用shuffle类算子
- 原则五:使用map-side预聚合的shuffle操作
- 原则六:使用高性能的算子
- 使用reduceByKey/aggregateByKey替代groupByKey
- 使用mapPartitions替代普通map
- 使用foreachPartitions替代foreach
- 使用filter之后进行coalesce操作
- 使用repartitionAndSortWithinPartitions替代repartition与sort类操作
- 原则七:广播大变量
- 原则八:使用Kryo优化序列化性能
- 原则九:优化数据结构
2 资源调优
- 资源参数调优
- num-executors
- executor-memory
- executor-cores
- driver-memory
- spark.default.parallelism
- spark.storage.memoryFraction
- spark.shuffle.memoryFraction
3 数据倾斜调优
- 解决方案一:使用Hive ETL预处理数据
- 解决方案二:过滤少数导致倾斜的key
- 解决方案三:提高shuffle操作的并行度
- 解决方案四:两阶段聚合(局部聚合+全局聚合)
- 解决方案五:将reduce join转为map join
- 解决方案六:采样倾斜key并分拆join操作
- 解决方案七:使用随机前缀和扩容RDD进行join
- 解决方案八:多种方案组合使用
4 shuffle调优
4.1 shuffle相关参数调优
- spark.shuffle.file.buffer
- spark.reducer.maxSizeInFlight
- spark.shuffle.io.maxRetries
- spark.shuffle.io.retryWait
- spark.shuffle.memoryFraction
- spark.shuffle.manager
- spark.shuffle.sort.bypassMergeThreshold
- spark.shuffle.consolidateFiles