MapReduce数据倾斜:
mapreduce处理过程有一个特点,相同的key,只能是发给同一个reduce进行处理。
原因:hadoop源码中有一行代码,(key.hashcode())%numReduce,先把key进行hash然后除以reduce的个数取余,相同的key的hashcode肯定一样,而且reduce数也确认,那肯定是相同的key都发给了同一个reduce了
举例:假设普通的key的value数是100个,而就有些个别的key的value数是10万个,这时普通的key对应的reduce处理很快,而个别的key对应的reduce显然会处理的很慢(它的处理10万),这样就会造成不平衡。
而对于提交的作业(job)什么时候才算运行结束呢?是要等到最后一个reduce执行完,才算结束。所以执行量小的reduce先执行完了,也得等着,等着量最大的、最慢的执行完,才能够算结束。
再说,造成数据倾斜的根本原因是什么:2点
1.key分布不均衡,有的则过于集中。倾斜在reduce阶段
2.datanode上数据分布不均衡。倾斜在map阶段。解释:datanode上的数据量大当然执行的时间要长。数据量小的则执行时间短。但是,这个地方有个特点:map执行完后,不用等其他map执行完,就开始执行下一个阶段了,但reduce阶段就不一样了,整个作业的执行完成,必须要等到最后一个reduce跑完(合情合理)。