埃尔法哥哥@Spark 数据倾斜的 8 大实用方法,解决( 四 )
对leftUnSkewRDD与rightUnRDD进行Join , 得到Join结果unskewedJoinRDD 。
通过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分布较为均匀 。
(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 , 性能稍微比一次的差些 。
- 三生石哥哥多家快递公司宣布会提高快递运送费用
- 埃尔法哥哥互联网空间会被用完吗?2025年全世界数据总量将会超过16万EB
- 埃尔法哥哥 人工智能与科技传播领域的融合
- 【埃尔法哥哥】kNN分类算法及其python实现
- 埃尔法哥哥■区块链技术迎风而上,ETX公链解决行业痛点,信息时代安全为王
- 『埃尔法哥哥』为什么你写的代码别人看不懂?
- 「埃尔法哥哥」ICCV2019:DeepFill一个用于生成图像修复任务的开源框架
- 『埃尔法哥哥』每一个程序员的必经之事
- 埃尔法哥哥■假装网络工程师-TCP/IP与静态路由
- 埃尔法哥哥▲需求侧响应又准又赚,AI加持