tu
一、判断是否是数据倾斜
看读取时间:数据来源,如Kafka,数据库读取
运行本身:数据问题
二、数据处理:
1)数据预处理
一是hive或sparkSQL预处理,过滤无用的key,或者在闲时处理倾斜数据
二是key-value 改为 key-values 的形式
2)动态监控key,利用redis等内存级别的数据库,并做处理。或添加key处理流程
三、改变并行度
1)算子指定(reduceByKey)
2)spark.defaule.paraller (80-100)cores的2-3倍
3)使用coalesce改变分区(repartition 会造成shuffle)
4)在读取数据时指定,比如textfile,minPartitions
5)继承父类RDD中的分区
四、mapJoin:将小的RDD进行广播
拓展:特殊情况,也可将大的数据进行广播,可以减少shuffle和内存使用,限制条件高(内存要大于数据量)
五、对key进行处理
1)抽样,取出数据倾斜的key:单独处理或者加随机数
2)大量倾斜的key,对一个RDD进行扩容N,另一个RDD进行随机数N。N越大,越不容易数据倾斜。但是会造成其他性能问题