Spark性能调优系列:(六)数据倾斜(将reduce join转为map join)

适用场景

在对RDD适用join类操作,或者是在SparkSQL中使用join语句时,而且join操作中的一个RDD或表的数据量较小(几百MB到几G),就适用该方案。

实现思路

不使用join算子进行连接操作,而使用Broadcast变量与map类算子实现join操作,进而完全避免shuffle类的操作,彻底避免数据倾斜的发生和出现,将较小RDD中的数据直接通过collect算子拉取到Driver端的内存中来,然后对其创建一个Broadcast变量。
接着对另外一个RDD执行map类算子,在算子函数内,从Broadcast变量中获取较小RDD的全量数据,与当前RDD的每一条数据按照连接key进行比对,如果连接key相同的话,那么就将两个RDD的数据用你需要的方式连接起来。

实现原理

普通的join是会走shuffle过程的,而且一旦shuffle,就相当于将相同key的数据拉取到一个shuffle read task中再进行join,此时就是reduce join。
但是如果一个RDD是较小的,则可以采用广播小RDD全量数据+map算子来实现与join同样的效果,也就是map join,此时则不会发生shuffle操作,也就不会发生数据倾斜。

优点

对join操作导致的数据倾斜,效果非常好,因为根本不会发生shuffle,也就根本不会发生数据倾斜。

缺点

适用场景较少,因为这个方案只适用于一个大表和一个小表的情况,毕竟我们需要将小表进行广播,此时会比较消耗内存资源,driver和每个Executor内存中都会驻留一份小RDD的全量数据,如果我们广播出去的RDD数据较大,比如10G以上,那么则会可能造成内存溢出,因此不适用两个都是大表的情况。

原理图

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值