Spark调优的三个角度
- Spark自身的性能红利
- 省数据处理、拖Shuffle操作
- 避免单机思维
一、Spark自身的性能红利
Tungsten钨丝计划
- Java Unsafe API开辟堆外内存
- 内存占用估算更精确
- 不用反复执行垃圾回收
AQE (Adaptive Query Execution)
Spark3.0之前:编译时基于规则遍历AST优化逻辑计划
AQE:周期性动态调整前面的逻辑计划 spark.sql.adaptive.enabled = True
- 自动分区合并
- 自动合并比较小的分区,减少CPU调度开销
- 数据倾斜
- 自动加盐
- Join策略调整
- 自动使用Broadcast Join
二、省数据处理、拖Shuffle操作
- 减少重复或者没必要的shuffle action,比如distinct
- 尽量避免或者向后移动shuffle,越靠后要处理的数据越少,落盘和分发越少
三、避免单机思维
Spark的配置项
Driver负责分布式调度,调优空间有限,围绕Executor展开配置。
硬件资源
硬件资源
- CPU
- 并行度:数据分片数量
- 并行计算任务:数据并行计算数量
- 内存
- 配置项
- 堆内外平衡
- (指针与偏移地址处理不定长数据)对于需要处理的数据集,如果数据模式比较扁平,而且字段多是定长数据类型,就更多地使用堆外内存。相反地,如果数据模式很复杂,嵌套结构或变长字段很多,就更多采用 JVM 堆内内存会更加稳妥。
- 磁盘
- 缓存密集还是计算密集(机器学习还是OLAP统计)
- 是否RDD缓存压缩spark.rdd.compress来序列化等,选择字节还是对象方式
Shuffle
落盘缓冲的次数spark.shuffle.file.buffer。减少IO
Spark SQL
AQE分区合并
AQE自动处理数据倾斜
JOIN策略调整
- Shuffle Join to Broadcast Join