文章目录
前言
- spark性能调优
- spark数据倾斜
- spark故障排除
一、spark性能调优
1.常规性能调优
- 最优资源配置
- RDD优化
- RDD复用
- RDD持久化
- RDD尽可能早的filter操作
- 并行度调节
- 广播变量
- Kryo序列化
- 调节本地化等待时长
2.算子调优
- mapPartitions
- foreachPartition优化数据库操作
- filter与coalesce的配合使用
- repartition解决SparkSQL低并行度问题
- reduceByKey预聚合
3.Shuffle调优
- 调节map端缓冲区大小
- 调节reduce端拉取数据缓冲区大小
- 调节reduce端拉取数据重试次数
- 调节reduce端拉取数据等待间隔
- 调节SortShuffle排序操作阈值
4.JVM调优
- 降低cache操作的内存占比
- 调节Executor堆外内存
- 调节连续等待时长
二、spark数据倾斜
spark数据倾斜问题主要是指shuffle过程中出现的数据倾斜问题,是由于不同的key对应的数据量不同导致的不同task所处理的数据量不同的问题。要注意区分数据倾斜和数据量过大的情况:数据倾斜是指少数的task被分配了绝大多数数据;数据过量是指所有的task被分配的数据量都很大。
1.数据倾斜的表现:
- Spark作业的大部分task都执行迅速,只有有限的几个task执行的非常慢,此时可能出现了数据倾斜
- Spark作业的大部分task都执行迅速,但是有的task在运行过程中会突然报出OOM,反复执行几次都在某一个task报出OOM错误,此时可能出现了数据倾斜
2.定位数据倾斜:
- 查阅代码中的shuffle算子,根据代码逻辑判断此处是否会出现数据倾斜
- 查看Spark作业的log文件,log文件对于错误的记录会精确到代码的某一行,可以根据异常定位到的代码位置来判定错误发生在第几个stage,对应的shuffle算子是哪一个。
3.解决数据倾斜方案:
- 聚合原数据
- 避免shuffle过程
- 增大key的粒度(可能会减小数据倾斜的可能性,增大每个task的数据量,但是某些场景下不适用)
- 缩小key的粒度(可能会增大数据倾斜的可能性,降低每个task的数据量)
- 过滤导致倾斜的key
- 提高shuffle操作中的reduce并行度
- 使用随机key实现双重聚合
- 将reduce join转换成map join
- sample采样对倾斜key单独进行join
- 使用随机数扩容进行join
三、spark故障排除
- 控制reduce端缓冲区大小以避免OOM
- JVM GC导致的shuffle文件拉取失败
- 解决各种序列化导致的报错
- 作为RDD的元素类型的自定义类,必须是可序列化的
- 算子函数里可以使用的外部的自定义变量,必须是可序列化的
- 不可以在RDD的元素类型、算子函数里使用第三方的不支持序列化的类型,例如Connection
- 解决算子函数返回NULL导致的问题
- 某些算子函数需要返回值,但是我们并不需要,可以这样解决:返回特殊值,例如-1;在通过算子获取了一个RDD之后,可以对这个RDD执行filter操作,将数值为-1的数据给过滤掉;在使用完filter算子后,继续调用coalesce算子进行优化。
- 解决YARN-CLIENT模式导致的网卡流量激增问题
- 解决YARN-CLUSTER模式的JVM栈内存溢出无法执行的问题
- 解决SparkSQL导致的JVM栈内存溢出
- 持久化与checkpoint的使用