数据倾斜产生原因及应对之道

产生数据倾斜的根本原因是某个task处理数据过多,执行时间较长,导致整个Job执行时间长,因此解决数据倾斜的根本之道就是避免过多的数据进入同一个task,总结起来主要有以下方式:

Group By产生数据倾斜

  1. 直接增加task并行度,简单粗暴,但并不一定能正在解决问题。倾斜是由多个key组合输入一个task导致数据过多, 这种方式有效,但如果存在单个hot key数据量大则无效。

  2. 预聚合,类似于Map Combine, 相当与把聚合运算提前分散到多个task, 减少最终聚合task的输入数据量

    hive中通过 set hive.map.aggr=true;

  3. 多次聚合,在hot key上加盐进行分组输入不同task进行聚合,然后再将聚合结果去掉盐值后分发到同一个task聚合,类似预聚合,减少最终task处理的数据量

    hive中通过 set hive.groupby.skewindata=true; 或者SQL中通过多次Group By维度越来越少就是这个原理

  4. 过滤掉hot key或者对hot key单独统计,比如NULL, 空字符串等也许业务上并非有效值,可过滤出单独处理

  5. 合乎业务逻辑情况下变换SQL写法,比如业务上count distinct在维度值不同情况下distinct列也不同时可优化成group by + count distinct + sum, 最终变换成多次聚合

Join产生数据倾斜

join产生数据倾斜一般是经过shuffle后hot join key集中到同一个task导致,解决方法主要有:

  1. 不经过shuffle, 比如join小表时采用broadcast hash join小表
  2. 如果检测到有倾斜的key(出现次数超过hive.skewjoin.key,默认为100,000),就会对该倾斜key启动一个MapReduce Job,做Map Join;对其他非倾斜的key启动另一个Job做Join
  3. join key分布均匀的表作为驱动表,在不需聚合的场景下此时不用对驱动表进行shuffle
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值