「埃尔法哥哥」Spark 数据倾斜的 8 大实用方法,解决( 四 )
通过union算子将skewedJoinRDD与unskewedJoinRDD进行合并 , 从而得到完整的Join结果集 。
TIPS:
rightRDD与倾斜Key对应的部分数据 , 需要与随机前缀集(1~n)作笛卡尔乘积(即将数据量扩大n倍) , 从而保证无论数据倾斜侧倾斜Key如何加前缀 , 都能与之正常Join 。
skewRDD的join并行度可以设置为n*k(k为topSkewkey的个数) 。
由于倾斜Key与非倾斜Key的操作完全独立 , 可并行进行 。
(1)适用场景
两张表都比较大 , 无法使用Map端Join 。 其中一个RDD有少数几个Key的数据量过大 , 另外一个RDD的Key分布较为均匀 。
【「埃尔法哥哥」Spark 数据倾斜的 8 大实用方法,解决】(2)解决方案
将有数据倾斜的RDD中倾斜Key对应的数据集单独抽取出来加上随机前缀 , 另外一个RDD每条数据分别与随机前缀结合形成新的RDD(相当于将其数据增到到原来的N倍 , N即为随机前缀的总个数) , 然后将二者Join并去掉前缀 。 然后将不包含倾斜Key的剩余数据进行Join 。 最后将两次Join的结果集通过union合并 , 即可得到全部Join结果 。
(3)优势
相对于Map则Join , 更能适应大数据集的Join 。 如果资源充足 , 倾斜部分数据集与非倾斜部分数据集可并行进行 , 效率提升明显 。 且只针对倾斜部分的数据做数据扩展 , 增加的资源消耗有限 。
(4)劣势
如果倾斜Key非常多 , 则另一侧数据膨胀非常大 , 此方案不适用 。 而且此时对倾斜Key与非倾斜Key分开处理 , 需要扫描数据集两遍 , 增加了开销 。
思路6.大表key加盐 , 小表扩大N倍jion
如果出现数据倾斜的Key比较多 , 上一种方法将这些大量的倾斜Key分拆出来 , 意义不大 。 此时更适合直接对存在数据倾斜的数据集全部加上随机前缀 , 然后对另外一个不存在严重数据倾斜的数据集整体与随机前缀集作笛卡尔乘积(即将数据量扩大N倍) 。
其实就是上一个方法的特例或者简化 。 少了拆分 , 也就没有union 。
(1)适用场景
一个数据集存在的倾斜Key比较多 , 另外一个数据集数据分布比较均匀 。
(2)优势
对大部分场景都适用 , 效果不错 。
(3)劣势
需要将一个数据集整体扩大N倍 , 会增加资源消耗 。
思路7.map端先局部聚合
在map端加个combiner函数进行局部聚合 。 加上combiner相当于提前进行reduce,就会把一个mapper中的相同key进行聚合 , 减少shuffle过程中数据量以及reduce端的计算量 。 这种方法可以有效的缓解数据倾斜问题 , 但是如果导致数据倾斜的key大量分布在不同的mapper的时候 , 这种方法就不是很有效了 。
TIPS:
使用reduceByKey而不是groupByKey 。
思路8.加盐局部聚合+去盐全局聚合
这个方案的核心实现思路就是进行两阶段聚合 。 第一次是局部聚合 , 先给每个key都打上一个1~n的随机数 , 比如3以内的随机数 , 此时原先一样的key就变成不一样的了 , 比如(hello,1)(hello,1)(hello,1)(hello,1)(hello,1) , 就会变成(1_hello,1)(3_hello,1)(2_hello,1)(1_hello,1)(2_hello,1) 。 接着对打上随机数后的数据 , 执行reduceByKey等聚合操作 , 进行局部聚合 , 那么局部聚合结果 , 就会变成了(1_hello,2)(2_hello,2)(3_hello,1) 。 然后将各个key的前缀给去掉 , 就会变成(hello,2)(hello,2)(hello,1) , 再次进行全局聚合操作 , 就可以得到最终结果了 , 比如(hello,5) 。
defantiSkew():RDD[(String,Int)]={valSPLIT="-"valprefix=newRandom().nextInt(10)pairs.map(t=>(prefix+SPLIT+t._1,1)).reduceByKey((v1,v2)=>v1+v2).map(t=>(t._1.split(SPLIT)(1),t2._2)).reduceByKey((v1,v2)=>v1+v2)}
不过进行两次mapreduce , 性能稍微比一次的差些 。
- 埃尔法哥哥万物互联的5G时代,将会给我们的生活带来哪些变化?
- 埃尔法哥哥我学python的一点感受
- 埃尔法哥哥使用哪种编程语言的开发人员最幸福?
- 埃尔法哥哥vue移动端开发时,客户端如何判断当前设备是Android还是IOS
- 埃尔法哥哥还可以做扫地机器人啊,自动驾驶不做了
- 埃尔法哥哥短期内难以找到替代华为海思的客户,寒武纪交出上交所答卷
- 埃尔法哥哥人工智能与人类的未来
- 爱搞事的瑞哥哥5G最具性价比手机,华为再次发力!荣耀X10成为标杆
- 牛牛侃天下嫂子卖掉嫁妆养他,结果养出位超级富豪,父亲去世后哥哥辍学打工
- 埃尔法哥哥Arvind Krishna全球首秀,IBM新CEO