0%
spark优化
- 算法性能优化
- 使用
reduceByKey
/aggregateByKey
替代 groupByKey
- 使用带 Partitions 的 API 进行计算(一次函数调用处理一个 Partition),如
mapPartitions
替代 map
- 使用手动添加前缀的方式优化由于数据倾斜带来的性能问题
- 并行度优化
- 调用
repartition
API 设置分区数量
- 设置默认的
shuffle
操作之后的分区数量
- 数据量变化之后,调用
coalesce
重设分区数量
- 缓存优化
- 调用
cache
persist
及 unpersist
以便控制哪一个 RDD
需要缓存
- 缓存
RDD
时考虑使用序列化缓存,进一步考虑压缩
- 内存优化
- 使用更节约内存的数据结构:如避免使用 java 的包装类型(boxed),避免使用内置的
Map
List
等数据结构(会创建额外的 Entry
对象)等
- 使用广播变量:对于某个只读的大对象,在一个
Executor
内部共享,而不是每个 task
都复制一份
- 调整 spark 管理的内存大小:配置
spark.memory
相关参数
- 调整 JVM 的新生代和老生代内存比例
- gc 优化:使用
G1
垃圾收集器
- 其他有用的优化方式
- 资源:配置
executor
的数量,每个 executor
的核数及内存,driver
的核数和内存
- 调度:配置是否重启一个较慢的任务,设置
spark.speculation
相关参数
- IO:使用节约空间的序列化方式,如配置
kryo
序列化,调整本地化程度等待时间 spark.locality.wait
参数