接触过mapreduce的同学都知道,为了将key值相同的record放在一起,分配给指定reducer,shuffle阶段会按照key值排序。
然而在某些情况下,我们需要同时对value排序,A同学立马提出了如下解决方案:reduce的时候,将同一个key的所有value都存在一个list中,最后再进行排序,这个方案在数据量小时没有问题,可是reducer的内存是有限的,当数据规模很大时,某个key可能会有几万个,几百万个value,上述方案在内存和性能上都是个灾难。
接着B同学灵机一动,既然map阶段按照key值排序,那么就把key和value一起作为新的key,使map输出<key_value, 1>,这样不就得到排序的结果了?但是B同学显然忘了shuffle好的数据是按照整个key来partition到各个reducer的,连接后的新key无法保证原key所有数据分发到同一个reducer上。
这时我们便需要mapreduce的二次排序机制了,二次排序机制其实和B同学的方案思路是相同的,只是在其之上增