总结:
一:key分布不均匀
1)key为null或异常值
对key进行打散
通过rand函数将为null的值分散到不同的值上;
对异常值赋一个随机值来分散key
2)key为正常值
1:设置reducer参数值,使用这个参数控制倾斜的阈值,如果超过这个值,新的值会发送给那些还没有达到的reduce
2:增加reduce的数量
3:业务需求方面进行细分
二:group by 产生倾斜的问题
group by既可以分类也可以去重
1:对Map 端部分聚合,相当于Combiner,设置hive.map.aggr=true
2:设置hive.groupby.skewindata=true
控制生成两个MR Job,第一个MR Job Map的输出结果随机分配到reduce做次预汇总,减少某些key值条数过多某些key条数过小造成的数据倾斜问题
即就是生成两个MapReduce Job。第一个Job进行预处理、部分聚合,使得结果是相同的Group By Key可以分发到不同的Reduce中;第二个MapReduce Job将预处理数据结果按照Group By Key分发到Reduce中,完成最终的聚合操作;
三:count distinct大量相同特殊值
count distinct时,将值为空的情况单独处理,如果是计算count distinct,可以不用处理,直接过滤,在最后结果中加1。如果还有其他计算,需要进行group by,可以先将值为空的记录单独处理,再和其他计算结果进行union(合并)。
详细内容
数据倾斜定义
任务进度长时间维持在99%(或100%),查看任务监控页面,发现只有少量(1个或几个)reduce子任务未完成。因为其处理的数据量和其他reduce差异过大。
单一reduce的记录数与平均记录数差异过大,通常可能达到3倍甚至更多。 最长时长远大于平均时长。
1 原因
1)、key分布不均匀
2)、业务数据本身的特性
3)、建表时考虑不周
4)、某些SQL语句本身就有数据倾斜