数据倾斜问题

数据倾斜会导致某些task处理数据量过大,影响Spark作业性能。通过定位倾斜算子,如耗时过长的stage,结合sample()抽样找出倾斜key。解决方法包括:提高shuffle并行度、两阶段聚合(局部+全局)、转换join类型(reduce到map端)以及利用广播和加盐策略。调整Spark参数,如增大reduce任务数,可以有效缓解倾斜问题。
摘要由CSDN通过智能技术生成

数据倾斜产生

       根本原因是上游task经过shuffle发往下游task的某一个或多个key的数量
  量特别大, 导致下游一个task需要处理的数据远远大于其他task;
  
一. 定位倾斜算子:
    1. 在spark UI(8080)中找到这个application的job那些耗时明显过长的stage,定位倾斜算子;
    2. 使用spark的sample()算子随机抽样,定位倾斜key;
      
 二. 处理数据倾斜
    1. 提高shuffle并行度
        reducebykey中的shuffle read task的默认值为200,也就是同时用200个task来处理任务, 调大参数;
    2. 聚合类数据倾斜
     采用两阶段聚合(局部聚合+全局聚合)
     首先定位倾斜key, 给倾斜key打上10以内的随机前缀(加盐操作),
     再进行聚合, 后用map切割一下封装成元组再做聚合, 可以提高数倍效率;
            
    3. join类数据倾斜
            reduce端join 转 map端join
            如果两表数据量都很小, 不管他们是大大表还是大小表join, 倾斜都不用处理;
            
          大小表join:
                 小表的数据量不大,比如1G之内,
              将小表数据拉倒driver端广播出去, 这样每一个executor中都有这个小表的cache
              下游reduce不会产生数据的分发, 从而避免了数据倾斜;
          
          大大表join;
                 采样倾斜key并拆分join操作
              通过sample()算子抽样定位倾斜

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值