0%

spark优化

spark优化

  • 算法性能优化
    • 使用 reduceByKey/aggregateByKey 替代 groupByKey
    • 使用带 Partitions 的 API 进行计算(一次函数调用处理一个 Partition),如 mapPartitions 替代 map
    • 使用手动添加前缀的方式优化由于数据倾斜带来的性能问题
  • 并行度优化
    • 调用 repartition API 设置分区数量
    • 设置默认的 shuffle 操作之后的分区数量
    • 数据量变化之后,调用 coalesce 重设分区数量
  • 缓存优化
    • 调用 cache persistunpersist 以便控制哪一个 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 参数

欢迎关注我的其它发布渠道