1.什么是数据倾斜
大家可能会发现这样一种现象:在执行hive查询的时候,map早已经100%了,而reduce也早早到了90% +,但是reduce可能会一连出现多个99%,而且迟迟停在99%,不再向下走,这是数据倾斜最常见的表现。
2.什么会导致数据倾斜
以MapReduce实现过程为例,如果大多数item对应用户量都是几十万的级别,少量item对应user量很大,例如百万以上,则聚集到这些item上(即对应的reduce上)的数据量就会很大,此时就出现数据倾斜的问题,整体速度方面就会很慢。详见:http://blog.csdn.net/lilyth_lilyth/article/details/9269693(侵删)使map的输出数据更均匀的分布到reduce中去,是我们的最终目标。由于Hash算法的局限性,按key Hash会或多或少的造成数据倾斜。大量经验表明数据倾斜的原因是人为的建表疏忽或业务逻辑。
出现数据倾斜一般是hive语句中有join操作,而且经常是大表和小表之间的关联。
3.解决数据倾斜思路:使用大表做驱动表,以防止内存溢出;Join最右边的表是驱动表;Mapjoin无视join顺序,用大表做驱动表;具体方法就是将大表放在后面,将小表放在join前面,但是有一个语句可以直接帮助我们做到这一点:
即在hive执行语句前加上:
set hive.auto.convert.join=true; —-自动判断大表和小表
其他解决方案可参照:
http://www.mamicode.com/info-detail-500353.html(侵删)