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