hivesql 效率优化

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进行随机化处理

你可能感兴趣的:(工欲善其事,必先利其器)