当前位置:   article > 正文

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

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值关联不上,处理后不影响最终的结果

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/582943
推荐阅读
相关标签
  

闽ICP备14008679号