回答思路
概念:大数据场景下,MapReduce程序执行时,reduce节点大部分执行完毕,但是有一个或者几个reduce节点运行较慢,导致整个程序的处理时间很长,这是因为某一个key的条目数比其他key多很多(甚至数百倍),这条key所在的reduce节点所处理的数据量比其他节点大很多,从而导致某几个节点迟迟运行不完。Hive的执行是分阶段的,map处理数据量的差异取决于上一个stage的reduce输出,所以如何将数据均匀的分配到各个reduce中,就是解决数据倾斜的根本所在。
常见数据倾斜情形:
解决方案:
(1)增加jvm内存,适用于唯一值非常少,极少数值有非常多的记录值,该情况下只能通过硬件的手段来调优,增加jvm内存可以显著的提高运行效率。
(2)增加reduce的个数,适用于唯一值比较多,该字段某些值有远远多于其他值的记录数,该情况下最容易造成的就是大量相同的key被partition到一个分区,从而一个reduce执行了大量的工作,如果增加了reduce的个数,计算的节点就多了,有益处。
(3)重新设计key,在map阶段给key加上一个随机数,有了随机数的key就不会被大量的分配到同一节点,等到reduce后再把随机数去掉即可。
(4)使用combinner合并,combinner是在map阶段,reduce之前的一个中间阶段,在该阶段可以选择性的把大量的相同key数据先进行一个合并,然后再交给reduce来处理。减轻了map端向reduce端发送的数据量,也减轻了map端和reduce端中间的shuffle阶段的数据拉取数量。