导语
  之前的分享中,介绍了有关MapReduce计算框的内容,这里来介绍一下MapReduce工作原理详解

mapreduce 是mpp架构 mapreduce的工作原理是什么_数据

Map端的流程

  • 1、从上图可以看出,一个输入分片就会有一个Map的任务来进行处理,并且Map输出的结果会暂时存放到一个缓冲区中,当这个缓冲区的内容溢出的时候,就会在本地创建一个溢出的文件,并且将缓冲区中的数据内容写入到这个文件中。
  • 2、在数据写入到磁盘之前,首先需要根据Reduce任务的数目将数据划分为相同的数目的分区,也就是说一个Reduce任务应该对应的一个分区的数据。这样做的目的就是防止有些Reduce任务分配到大量的数据,有些Reduce任务则没有数据或者数据量很少的情况发生,也就是通常讲的堆数据进行一致性hash这样的操作,保证数据能均匀的分布。然后对每一个分区的数据进行一个排序操作,如果设置了Combiner,将排序后的结果进行Combine操作,这样做的目的就是尽可能少的数据写入到磁盘中。
  • 3、如果Map中的记录是最后一条的时候,会有很多的溢出的文件,这个时候需要将这些溢出的文件进行合并操作,在整个的合并过程中会不断的进行排序和Combine的操作。这样做主要有两个目的
  • 减少每次写入磁盘的数据量
  • 减少下一个复制阶段网络传输的数据量
  • 4、将分区中的数据拷贝给相对应的reduce任务。分区中的数据是如何知道与其对应的reduce是哪一个?这就是在Map任务中一直和其父级TaskTracker保持联系,而TaskTracker又一直与JobTracker 保持心跳。所以JobTracker中保存了整个集群中的宏观信息。只要reduce任务想JobTracker获取对应的Map输出的位置就可以了。

Reduce端流程

1、Reduce 会接收到不同的map任务传来的数据,并且每一个map 传递的数据都是有序的,如果reduce端接受的数据量相当小,直接存储在内存中(缓冲区大小可以通过参数来控制),如果数据量超过了该缓冲区大小的一定比例,则对数据合并后写入磁盘中。
2、随着写入文件的增加,后台线程会将它们合并成一个更大的有序文件,这样做的目的是为了给后面的合并节省时间,其实无论是map端还是reduce端,MapReduce 都是反复地执行排序、合并等操作。所以排序是hadoop的灵魂。
3、合并过程中会产生许多的中间文件,但是MapReduce会让写入磁盘的数据尽可能的减少,并且最后一次合并的结果并没有写入到磁盘,而是直接输出到reduce函数。

  在Map处理数据后,到Reduce得到数据之前,这个流程在MapReduce中可以看做是一个Shuffle的过程。

总结

  在经过Mapper的运行之后,可以知道Mapper的输出是一个KV键值对,到底当前的key应该交给哪个Reduce来处理,是需要当时就决定的。MapReduce 提供Partitioner接口,它的作用就是根据key或者value以及reduce的数量来决定当前的这个键值对输出的数据最终是哪个Reduce Task 所处理的,默认对key做了Hash之后再以 reduce task数据量取模。这样的方式只是为了平均reduce的处理能力。