一、数据倾斜产生原因
1.操作
join
- 一个表很小,但是key集中;分发到某一个或者几个Reduce上的数据远高于平均值。
- 大表与大表,但是字段的空值很多;这些空值都由一个reduce进行操作,速度非常的慢。
group by
- 数据维度非常的小,某值的数据非常多;处理某值的reduce非常耗时。
count distinct
- 某特殊值多;处理此特殊值的reduce非常的耗时。
2.原因
(1)key值分布不均匀。
(2)业务数据本身的问题。
(3)建表时候考虑不周。
(4)某些sql语句的问题,本身就有数据倾斜的问题。
3.表现
各个reduce处理数据所需时间差异性很大。
二、数据倾斜的解决方案
1.参数调节
hive.map.agge=true
Map端部分聚合,相当于Combiner
hive.groupby.skewindata=true
有数据倾斜的时候进行负载均衡,当选项设定为true,生成的查询计划会有两个MR Job中,Map的输出结果集合会随机分布到Reduce中,每个Reduce做部分聚合操作,并输出结果,这样处理的结果是相同的Group By Key有可能被分发到不同的Reduce中,从而达到负载均衡的目的;第二个MR Job再根据预处理按照Group By Key分布到Reduce中(这个过程可以保证相同的Group By Key