map的输出会经过一个名为shuffle的过程交给reduce处理, 当然也有map的结果经过sort-merge交给reduce处理的。其实在MapReduce流程中, 为了 让 reduce可以并行处理map结果, 必须对map的输出进行一定的排序和分割 , 然后再交给对应的 reduce, 而这个将map输出进行进 一步整理并交给reduce的过程就成 为了shuffle。从shuffle的过程中可以看出, 它是 Map Reduce的核心所在, shuffle过程的性能与整个MapReduce的性能直接相关。
总体来说, shuffle过程包含在map和 reduce两端中。在map端的shuffle过程是对map的结果进行划分(partition)、 排序(sort)和分割(spill),然后将属于同一个划分的输出合并在一起(merge), 并写在磁盘上, 同时按照不同的划分将结果发送给对应的reduce (map 输出的划分与 reduce的 对应关系由JobTracker确定〉。reduce端又会将各个map送来的属于同一个划分的输出进行合并(merge), 然后对merge的结果进行排序, 最后交给reduce处理。 下面将从map和reduce两端详细介绍shuffle过程。
1.Map端
从MapReduce的程序中可以看出, map的输出结果是由collector处理的, 所以map端 的shuffle过程包含在collect函数对map输出结果的处理过程中。 下面从具体的代码来分析 map端的shuffle过程。首先从collect函数的代码入手。 从下面的代码段可以看出 map函数的输出内存缓冲区是