Hive 执行 MapReduce 过程中经常会出现数据倾斜问题,具体表现为:作业经常在 Reduce 过程完成 99% 的时候一直停留,最后 1% 一直保持很久才完成。这种情况是由于:在数据量很大的情况下,在 MapReduce 的 Shuffle 过程执行后,key值分布到 Reducer 节点不均匀;有的 key 少,哈希后被分在不同节点中没有问题,但是有的 key 特别的多,过于集中了,全被分配在一个 Reducer 节点,所以其他的 Reducer 都执行完了都在等这个量大的 key 值,这就导致了数据倾斜。通俗的话来讲就是,一堆干完活的人等那个干的最慢的人,不是因为那个人能力差,大家能力水平都相同,是他真的干不完……被分配太多了,别人做完了也没法帮忙。
所以这也违背了 MapReduce 方法论产生的核心思路,不怕活儿多,活多咱们可以多分配人手;最怕的就是活分配不均匀,有人干的多,有人干的少,出现时间上的浪费。这些工作在 MapReduce 过程中,往往都出现在 GROUP
BY 等分组,各种类型 JOIN 过程中。常见产生数据倾斜的原因大致有以下几种:大量空值
某个 key 值大量重复
不同数据类型关联
COUNT(DISTINCT)
接下来详细介绍各种出现以及如何避免这类问题的出现。
二、问题分类及解决思路
1.大量空值产生数据倾斜
解决思路:利用随机数将空值进行随机填充,注意:不要让随机数碰撞到其他值,提