1.什么是数据倾斜
数据倾斜:数据分布不均匀,造成数据大量的集中到一点,造成数据热点。主要表现为任务进度长时间维持在 99%或者 100%的附近,查看任务监控页面,发现只有少量 reduce 子任务未完成,因为其处理的数据量和其他的 reduce 差异过大。 单一 reduce 处理的记录数和平均记录数相差太大,通常达到好几倍之多,最长时间远大 于平均时长。
根本原因就是大量相同的key被分配到一个reduce里,造成一个reduce任务累死了,但是其他的reduce任务闲死
2.产生的原因
1,key 分布不均匀。
2,业务数据本身的特性。
3,建表考虑不周全。
4,某些 hsql 语句本身就存在数据倾斜。
就像进行表关联时:
(1)大表join小表:其实小表的key集中,分发到某一个或者几个reduce上的数据远远高于平均值
(2)大表join大表:空值或无意义值:如果缺失的项很多,在做join时这些空值就会非常集中,拖累进度。
(3)group by: group by的时候维度过小,某值的数量过多,处理某值的reduce非常耗时间。
(4)Count distinct:某特殊值过多,处理此特殊值的reduce耗时。
3.具体的数据倾斜以及解决方法:
3.1 空值产生的数据倾斜
使本身为 null 的所有记录替代随机字符串或者先过滤掉空值,而分散到了多个 reduceTask 中了,由于 null 值关联不上,处理后并不影响最终结果。
过滤掉空值的情况
select * from log a join user b on a.user_id is not null and a.user_id = b.user_id
union all
select * from log c where c.user_id is null;
(2)赋予空值新的