当前位置: 代码迷 >> 综合 >> hivesql 效率优化
  详细解决方案

hivesql 效率优化

热度:29   发布时间:2024-01-14 12:05:10.0
1.group by 数据倾斜问题
hive是根据group by 的key进行数据分发的,某个key相同的数据太多的会被分发到一个reducer上,key的数据分布不均匀会导致大量数据被shuffle到某个或者某些reducer上,出现严重的数据倾斜,使得数据计算变慢

配置任务参数   set hive.groupby.skewindata=true;
原理:该配置会触发hive增加额外的mr过程,随机化key后进行聚合操作得到中间结果,再对中间结果执行最终的聚合操作

注意:count(distinct) 操作比较特殊,无法进行中间的聚合操作,因此该参数对有count(distinct)操作的sql不适用,如果有count(distinct)的需求可以优化sql,先进行一步group by进行变形

2.map优化

大表join小表时候可以使用map join

配置参数  set hive.auto.convert.join=true;

原理:使用该配置,hive会自动识别比较小的表,继而用mapJoin来实现两个表的联合

3.count(distinct)优化

是第一个问题的延伸,包含count(distinct)操作必须在一个reducer上完成,数据倾斜不能使用预聚合的方式进行优化

配置参数:使用group by替代 count(distinct) 操作,使用group by将count(distinct)等价替换掉

4.join 数据倾斜
hive 根据 join key 对两边表的数据进行shuffle,若key数据分布不均匀会出现数据倾斜的现象

优化方案:
1.保证两种表的粒度是正确的,join key在至少至少一张表中是不重复的,否则会出现类似笛卡尔积的效果,造成数据膨胀

2.如果join key是无意义的空值等,直接剔除掉再进行关联

3.对join key 进行随机化处理

set hive.mapred.mode=nonstrict;
在join过程中对key进行随机化处理
  相关解决方案