Spark之数据倾斜(二)

数据倾斜解决方案:

        (四)提高shuffle操作的reduce并行度

        一个简单的方法,可以一定程度的缓解数据倾斜,但是,它治标不治本。将reduce task的数量变多,可以让每个reduce task分配到更少的数据量,这样的话,也许就可以缓解或者甚至是基本解决掉数据倾斜的问题。这种方案实施也简单,调用shuffle算子,比如groupByKey、countByKey、reduceByKey的时候,最后一个参数是并行度,传入一个int数值,那个数字,就代表了那个shuffle操作的reduce端的并行度,那么在进行shuffle操作的时候,就会对应着创建指定数量的reduce task。这样的话,就可以让每个reduce task分配到更少的数据,至少可以避免OOM的情况,程序至少是可以跑的,基本可以缓解数据倾斜的问题。

        这种方法只是尽可能地去缓解和减轻shuffle reduce task的数据压力以及数据倾斜的问题,没有从根本上改变数据倾斜的本质和问题,在实际生产中基本会有两种结果:1.如果最理想的情况下,提升并行度以后,减轻了数据倾斜的问题,或者甚至可以让数据倾斜的现象忽略不计,那么就最好。就不用做其他的数据倾斜解决方案了。 2。不太理想的情况下,就是比如之前某个task运行特别慢,要5个小时,现在稍微快了一点,变成了4个小时;或者是原先运行到某个task,直接OOM,现在至少不会OOM了,但是那个task运行特别慢,要5个小时才能跑完。
        如果生产环境中遇到第二种情况,那么就需要其他的方法来解决数据倾斜的问题,而不能就这么止步于缓解。

        (五)使用随机key实现双重聚合

        原理

        使用场景 (1)groupByKey (2)reduceByKey 

        第一轮聚合的时候,对key进行打散,将原先一样的key,变成不一样的key,相当于是将每个key分为多组; 先针对多个组,进行key的局部聚合;接着,再去除掉每个key的前缀,然后对所有的key,进行全局的聚合。 对groupByKey、reduceByKey造成的数据倾斜,有比较好的效果。 如果说,之前的第一、第二、第三种方案,都没法解决数据倾斜的问题,那么就只能依靠这一种方式了。

        这种方式比较适合join造成的数据倾斜。

                                                             

                                                                                                                                                                                                      未完......


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值