Spark数据倾斜解决方案

  • 数据倾斜的原因:

       在数据中存在一个或少数数量key对应的数据量特别大,导致在spark处理task进行shuffle的时候,大部分task都很快的执行完毕,剩下的少数task执行时间特别长甚至直接fail。

  • 解决方案:

 

 

1、直接从源头进行解决:

    1.1 在spark的上游--处理源数据的过程中,直接将可能会发生数据倾斜的数据根据key聚合为一条数据,从根本上杜绝了发生数据倾斜的可能性。

    1.2 如果业务上可以接受丢失可能发生数据倾斜的数据,那么spark加载数据的时候直接使用filter算子将可能发生数据倾斜的数据筛除。

 2、不能从源头解决的情况:

 2.1  针对groupByKey、countByKey等shuffle算子:

 2.1.1 增大reduce端的并行度
            
            假设key为1的数据引起了数据倾斜,那么在使用groupByKey或者countByKey算子进行shuffle的时候,传入参数,比如groupByKey(500)
            ,设置reduce端的并行度为500,在处理数据的时候就可以创建更多的task来处理数据。
            
  2.1.2 二次shuffle聚合
            
            问题既然是key对应的数据过多,那么就想办法使key对应的数据变少,数据量是不变的,所以只有增加key的数量,才能使key对应的数据量变少。
            
            具体操作:
            
                1.先使用sample采样找出比如10%的数据,然后找出里面对应数据最多的一个或者几个key;
                2.对rdd进行map,如果key是属于上一步骤找到的key,则在key前面拼接一个随机数,比如【1_key】,然后进行shuffle操作;
                3.将结果rdd再次进行map,将之前拼接的key还原,再次进行shuffle操作。
            
            注意点:
                
                最好先采样,对可能导致数据倾斜的rdd的key进行拼接,否则如果对每个rdd的key都进行拼接的话,虽然可能导致数据倾斜的rdd的key对应的value数量变少,但是可能会导致普通数量的rdd的key对应的数量也变少了,效果可能不太理想。
                
                所以最好只对可能导致数据倾斜的rdd的key进行拼接。

2.2 针对join算子

2.2.1 将rdd变为broadCast变量,适用map的方式进行join
            
            适用情景:一个较小的rdd去join一个较大的rdd
            
            操作方法:data = sc.broadCast(rdd.collect());
                      data.value;
                      
                      再通过逻辑判断来替换join的功能
                      
2.2.2 sample采样倾斜key单独进行join ----【类似2.1.2】
        
2.2.3 扩大数据规模
            
            适用条件:两个rdd都比较大
            
            操作步骤:在内存允许的情况下适用flatMap将一个rdd的key加上一个随机数作为前缀以扩容
                      另外一个rdd则mapToPair将key加上随机数前缀


欢迎加群大家一起学习大数据~群里还有很多资料可供参考~

大数据大佬菜鸡交流群 575419003

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值