spark调优之大rdd倾斜解决:sample采样倾斜key单独进行join

spark调优之大rdd数据倾斜解决:

ps:如果rdd有一个数据量比较小的话,是可以通过broadcast转化成mapjoin的;
如果是两个大rdd,其中倾斜的key少的话=》sample采样倾斜key单独进行join
如果是两个大rdd,其中倾斜的key多的话=》使用随机数以及扩容表进行join
**

一、当两个大rdd,其中倾斜的key少:sample采样倾斜key单独进行join

解释:

  1. rdd2中key为“001”的数据非常多,导致数据倾斜,那么我们把rdd1、rdd2中的key为001的数据单独拿出来join;剩下的正常的key自己进行join,这两个join的结果最后进行union
  2. 对于rdd1的key为001的数据筛选出来,每一条数据加上0、1、2、3、4的前缀,rdd1这边001的数据量变成原来的5倍!
  3. 对于rdd1的key为001的数据筛选出来,每一条数据打上0-5的前缀(ps: 实际使用的时候打10好像差不多),rdd2这边001的数据量加完前缀后,条数不变的;
  4. 然后两者进行join,之后将key的前缀进行删除,然后与另外的join结果进行union
    //这是正常数据量的rdd里面的“001”的数据,给它打上0-5的数,一条数据变5条数据
    var list=List[(String,String)]()
    val rdd1 = sc.parallelize(Array(("001","北京"),("001","上海")))
        .filter(x=>x._1.equals("001"))
        .flatMap(x=>{
        //  var list=List[(String,String)]()  list放在这两个位置都是一样的
          for(i<-0 to 4 )
          {list:+=(  i.toString+"_"+x._1,x._2)}
          list
        })
    rdd1.foreach(println)
    println("_"*40)


//这是产生数据倾斜的大数据量的rdd里面的倾斜key数据,给它打上0-5的随机数,还是一条数据对应一条数据
    val rdd2: RDD[(String, String)] = sc.parallelize(Array(("001","可乐"),("001","雪碧"),("001","菠萝")
      ,("001","苹果") ,("001","牛奶") ,("001","香蕉")))
      .map(x => {
        val p= scala.util.Random.nextInt(4).toString
        ( p+"_"+x._1,x._2)
      })

    rdd1.join(rdd2,100).map(x=>{(x._1.substring(2),x._2)})foreach(println)


结果:

(0_001,上海)
(1_001,上海)
(2_001,上海)
(3_001,上海)
(4_001,上海)
(0_001,北京)
(1_001,北京)
(2_001,北京)
(3_001,北京)
(4_001,北京)
________________________________________
(001,(北京,可乐))
(001,(北京,雪碧))
(001,(北京,香蕉))
(001,(上海,雪碧))
(001,(北京,菠萝))
(001,(上海,香蕉))
(001,(北京,苹果))
(001,(北京,牛奶))
(001,(上海,可乐))
(001,(上海,菠萝))
(001,(上海,苹果))
(001,(上海,牛奶))

二、两个大rdd,其中倾斜的key多的话=》使用随机数以及扩容表进行join

和上一个差不多,只是,不把数据倾斜的key拿出来单独join了;直接把原来的rdd进行操作;
这个方案是没办法彻底解决数据倾斜的,更多的,是一种对数据倾斜的缓解。
步骤:
1、选择一个RDD,要用flatMap,进行扩容,将每条数据,映射为多条数据,每个映射出来的数据,都带了一个n以内的随机数,通常来说会选择10。
2、将另外一个RDD,做普通的map映射操作,每条数据都打上一个10以内的随机数。
3、最后将两个处理后的RDD进行join操作。

局限性
1、因为你的两个RDD都很大,所以你没有办法去将某一个RDD扩的特别大,一般咱们就是10倍。
2、如果就是10倍的话,那么数据倾斜问题的确是只能说是缓解和减轻,不能说彻底解决。
sample采样倾斜key并单独进行join
将key,从另外一个RDD中过滤出的数据,可能只有一条或者几条,此时,咱们可以任意进行扩容,扩成1000倍。
将从第一个RDD中拆分出来的那个倾斜key RDD,打上1000以内的一个随机数。
这种情况下,还可以配合上,提升shuffle reduce并行度,join(rdd, 1000)。通常情况下,效果还是非常不错的。
打散成100份,甚至1000份,2000份,去进行join,那么就肯定没有数据倾斜的问题了吧。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值