原因:
key的hash值分布不均匀或者业务本身的特性,造成reduce上的数据量差异过大,导致某些reduce任务进度长时间维持在99%。某些SQL语句本身就有数据倾斜。
解决方案:
1>参数调节:
开启map端合并(combine操作) hive.map.aggr=true
开启负载均衡 hive.groupby.skewindata=true
2>SQL语句调节:
1)两个表join的时候选用key分布最均匀的表作为驱动表,做好列裁剪和过滤操作。
2)小表Join大表: 使用mapjoin让小表进内存,在map阶段和大表匹配,省去了reduce阶段
如:select /*+ MAPJOIN(a) */ a.c1, b.c1 ,b.c2 from a join b where a.c1 = b.c1;
3)大表Join大表:把空值的Key变成一个字符串加上一个随机数,随机的分发到不同的reduce上。
如:select * from log a left outer join users b on
case when a.user_id is null
then concat(‘hive’,rand() )
else a.user_id end = b.user_id;
4)Count distinct大量数据时,将值为空的情况单独处理,比如可以直接过滤空值的行,在最后结果中加1。Group by 维度过小时,使用Sum和GROUP BY 代替COUNT(DISTINCT) 操作 //COUNT(DISTINCT)只会产生一个Reducetask
Hive数据倾斜原因及解决方案
最新推荐文章于 2023-02-10 10:34:56 发布