Hive数据倾斜原因及解决方案

原因:
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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值