数据倾斜
什么是数据倾斜?
1、字面理解是数据偏向于某一方。
2、其实就是大量相同的key被partition分配到一个分区里。
执行
我们在平台执行任务中,卡在一个点持续时间过长,任务进度长时间维持在99%(33%、66%或100%)。任务实际是在执行,查看任务监控页面,发现只有少量(1个或几个)reduce子任务未完成。因为处理的数据量和其他reduce差异过大,需要时间,莫慌。
Hive的数据倾斜,一般都发生在Sql中Group和On上,而且和数据逻辑绑定比较深。
原因
JOIN(经常遇到):
其中一个表较小,但是key集中。分发到某一个或几个Reduce上的数据远高于平均值。
大表与大表,但是分桶的判断字段0值或空值过多,这些空值都由一个reduce处理,非常慢。
GROUP BY:
group by 维度过小,某值的数量过多。处理某值的reduce非常耗时。
Count Distinct:
某特殊值过多,处理此特殊值的reduce耗时。
小结
1、key分布不均匀
2、业务数据本身的特性
3、建表时考虑不周
4、某些SQL语句本身就有数据倾斜
解决
1、关于驱动表(主表)的选取,选用join key(id)分布最均匀的表作为驱动表。