【Hive】数据倾斜原因及解决方法汇总

(1)数据倾斜根本原因:由于数据分布不均匀,导致map端读取的数据分布不均匀(数据长尾分布),从而使得map处理的数据量差异过大。
(2)解决思路:Hive是分阶段执行的,map处理数据量的差异取决于上一个stage的reduce输出,所以解决的根本方法就是如何将数据均匀的分布到各个reduce中

(3)出现数据倾斜的主要操作
(a)join:使用join时,一个表较小,但是key值集中,使得数据在分发到各个reduce中的时候,某一个或几个reduce的数据远大于平均值
(b)join:大表与大表join时,分桶的判断字段0值或空值太多,而这些数据都会到一个reduce中处理,速度很慢
(c)group by:group by的维度太少,某值的数量太多(如性别sex,只有男和女,group by时只有两个维度,每个维度的数据量都很大),从而导致处理某个值数据的reduce处理非常耗时
(d)count distinct:某特殊值较多,数据将会在一个reduce中处理,处理此特殊值的reduce耗时

(4)原因概况:
(a)key值分布不均匀
(b)数据自身问题
(c)SQL语句问题

(5)数据倾斜表现:任务进度长时间维持在99%(或100%),查看任务监控页面,发现只有少量(1个或几个)reduce子任务未完成。因为其处理的数据量和其他reduce差异过大。
单一reduce的记录数与平均记录数差异过大,通常可能达到3倍甚至更多。 最长时长远大于平均时长。

(6)数据倾斜解决方法
(a)参数调节:hive.map.aggr = true 在map端部分聚合
(b)参数调节:hive.groupby.skewindata=true 数据倾斜时负载均衡
(c)sql语句调节:join时选择key值分布较均匀的表作为驱动表,同时做好列裁剪和分区裁剪,以减少数据量
(d)sql语句调节:大小表join时,小表先进内存
(e)sql语句调节:大表join大表时,把key值为空的key变成一个字符串加上随机数,把倾斜的数据分到不同的reduce上,由于null值关联不上,因此处理后不影响最终结果

参考文献
https://www.cnblogs.com/ggjucheng/archive/2013/01/03/2842860.html
https://www.jianshu.com/p/deb4a6f91d3b
https://www.cnblogs.com/qingyunzong/p/8847597.html

你可能感兴趣的:(SQL,Hive,数据倾斜,原因,解决方法,思路)