Spark性能调优系列:(七)数据倾斜(采样倾斜key并分拆join操作)

适用场景

两个RDD/Hive表进行join的时候,如果数据量都比较大,无法采用上一个方案时,那么此时可以看看两个RDD或hive表中的key分布情况。
如果出现数据倾斜,是因为其中的某一个RDD/Hive表中的少数几个key的数据量过大,而另一个RDD/Hive表中的所有key都分布比较均匀,那么采用这个解决方案比较合适。

实现思路

对包含少数几个数据量过大的key的那个RDD,通过sample算子采样出一份样本,然后统计一下每个key的数量,计算出来数据量最大的是哪几个key,
然后将这几个key对应的数据从原来的RDD中拆分出来,形成一个单独的RDD,并给每个key都打上n以内的随机数作为前缀,而不会导致倾斜的大部分key形成另外一个RDD,
接着将需要join的另一个RDD,也过滤出来那几个倾斜key对应的数据并形成一个单独的RDD,将每条数据膨胀成n条数据,这几条数据都按照顺序附加一个0~n的前缀,不会导致倾斜的大部分key也形成另一个RDD。
再将附加了随机前缀的独立RDD和另外一个膨胀了N倍的独立RDD进行join,此时就可以将原先相同的key打散成n份,分散到多个task中进行join了。
而另外两个普通的RDD就照常join即可,最后将两次join的结果使用union算子合并起来即可,就是最终的join结果。

实现原理

对于join导致的数据倾斜,如果只是某几个key导致了数据倾斜,可以将少数几个key分拆成独立RDD,并附加随机前缀打散成n份去进行join,此时这几个key对应的数据就不会集中在少数几个task上,而是分散到多个task进行join了。

优点

对于join导致的数据倾斜,如果只是某几个key导致了倾斜,采用该方式可以用最有效的方式打散key进行join,而且只需要针对少数倾斜key对应的数据进行扩容N倍,不需要对全量数据进行扩容吗,避免占用过多的内存。

缺点

如果导致倾斜的key特别多的话,比如成千上万个key都导致数据倾斜的话,那么这种方式也不适合。

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值