- 用户提交MapReduce作业到Master节点上。
- 由Master节点将M个Map任务和R个Reduce任务分配到空闲的节点上运行。输入文件被分成固定大小 (默认为64 MB, 用户可以调整) 的M个分片(split) 。Master节点会尽量将任务分配到离输入分片较近的节点上执行, 以减少网络通信量。
- 在Map阶段, 被分配到Map任务的节点以输入分片作为输入, 对于每条记录, 会执行map函数, 产生一系列 key intermediate /value intermediate 对, 这些数据会缓存于内存中。
- 缓存的 key intermediate /value intermediate 对会按 key intermediate进行排序, 利用分区函数将输出结果分为R个区, 以一定的时间间隔写入节点的硬盘, 并将数据的位置信息传送到Master节点。
- Master节点接收到中间结果的位置信息后,会将位置信息传送给Reduce任务的节点, Reduce任务节点远程读取中间结果。在这一阶段中, 数据会在不同节点之间进行相互传输, 因此这一阶段也被称为数据混洗 (shuffle) 阶段。当Reduce任务读取到全部的中间结果后, 会按 key intermediate 进行再次排序,以保证数据按 key intermediate 连续存放。
- 在 Reduce 阶 段 , 处 理 有 序 的 key intermediate /value intermediate 对集合, 对相同的 key intermediate 结果进行合并处理, 执行用户提供的reduce函数, 并将最终结果写入到分布式文件系统上。
由 MapReduce 处理过程可以看出, MapReduce框架将问题分而治之, 并且将计算尽量分配到数据存储的节点(即将计算移到数据,“移动计算而不是移动数据”的策略), 以减少计算中大量的数据通信开销。
详解:
在第3步,内存缓冲区有大小限制,默认是100MB;如果缓冲区中的内容过多就需要将它的内容交换到磁盘中,这一步称为spill,为了不影响map参数的执行和缓冲区的交换,缓冲区不会再真正写满之后再全部写入到磁盘,而是通过参数控制交换到磁盘的时机。如果map结果集较小能全部放入到内存中,那么只需要最后写一次磁盘。总之我的看法是,map出来的中间数据小,就放内存,内存放不进,spill到磁盘;反正最后都要写到磁盘。