数据倾斜的几种常见场景:
1.distinct
2.group by
3.reducejoin
4.动态分区
1可以转换到2,2可以加参数就可以解决,原理在于预处理
参数:set hive.groupby.skewindata=true; --如果是group by过程出现倾斜 应该设置为true,这种方法会启动两个job,第一个job会在key前面添加一个随机数,将数据散列到reduce中,第二个job就是将key前面的随机数去掉进行聚合。
对于常见的情况3,是发生在关联处(比如on a.id=b.id),处理措施如下:
(首先考虑下数据取数范围、过滤条件,尽早过滤数据)
先查看a.id的数据量分布情况,
select id,count(1) as num from a group by id order by num desc
A:若是发现有大量null情况,就赋随机值处理
on (nvl(a.id,concat('HIVE_',rand())=b.id)
这样随机值就会打散reduce分布的数量,效果明显,原本要1小时的可以在1min内跑完
B:若是a.id的值有业务含义,此时就不能草率赋随机值,此时应该查看维表b的数据量情况,若是一张小表,