hive产生数据倾斜的原因以及解决办法

  1. Hive的数据倾斜  过滤导致数据倾斜的key、空key转换

有时join超时是因为某些key对应的数据太多,而相同的kkey对应的数据都会发送到相同的reducer上,从而导致内存不够,此时我们应该仔细分析这些异常的key,很多情况下,这些key对应的数据是异常数据,我们需要在sql语句中进行过滤

有时虽然某个key为空对应的数据很多,但是相应的数据不是异常数据,必须要包含在join的结果中,此时我们可以表a中key为空的字段赋一个随机的值,使得数据随机均匀地分布到不同的reducer上

    1. Hive数据倾斜   设置MapJoi

如果不指定MapJoin或者不符合MapJoin的条件,那么hive解析器会将Join操作转化成Common join,即:在Reduce阶段完成join。容易发生数据倾斜,可以用MapJoin把小表全部加载到内存在map端进行join,避免reducer处理

    1. Group by优化

默认情况下,Map阶段同一Key数据分发给一个reduce,当一个key数据过大时就倾斜了。并不是所有的聚合操作都需要在Reduce端完成,很多聚合操作都可以先在Map端进行部分聚合,最后在Reduce端得出最终结果。

   (1)开启Map端聚合参数设置,默认为True

hive.map.aggr = true

  (2)在Map端进行聚合操作的条目数目

hive.groupby.mapaggr.checkinterval = 100000

  (3)有数据倾斜的时候进行负载均衡(默认是false)

hive.groupby.skewindata = true

    1. Count(distinct)去重优化(数据倾斜)

数据量小的时候无所谓,数据量大的情况下,由于COUNT DISTINCT操作需要用一个Reduce Task来完成,这一个Reduce需要处理的数据量太大,就会导致整个Job很难完成,一般COUNT DISTINCT使用先GROUP BY再COUNT的方式替换,虽然会多用一个Job来完成,但在数据量大的情况下,这个绝对是值得的

    1. 笛卡尔积

尽量避免笛卡尔积,join的时候不加no条件,或者无效的on条件,hive只能使用1个reduce来完成笛卡尔积

    1. 使用combine(数据倾斜)

使用Combine可以大量的减少数据频率倾斜和数据大小倾斜,在可能的情况下,combine的目的就是聚合并精简数据

    1. 抽样和范围分区(数据倾斜)

可以通过对原始数据进行抽样得出的结果集来预设分区边界值

    1. 自定义分区(数据倾斜)

    1. 为倾斜key打上随机数(数据倾斜)

把导致倾斜的key变成一个字符串加上随机数,把倾斜的数据分到不同的reduce上,由于null值关联不上,处理后不影响最终的结果

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值