MapReduce的原理

1.什么是MapReduce?
  MapReduce是一个分布式的计算框架。它由两部分组成Map和Reduce。
2.MapReduce的主要思想
  分久必合。
3.MapReduce的核心思想
  “相同的key为一组,一组调用一次reduce方法”。
4.MapReduce分布式计算原理
  主要流程:
MapReduce的原理_第1张图片

  • block中的数据会以的形式进入map task,key是偏移量。
  • 一个split(切片)大小=block大小。一个split由一个map task处理。但是一条记录可能会存放在两个block中,所以split实际上会比block大几KB或小几KB。也就是说,split只是一个逻辑概念。
  • 经过map task处理后的记录的key值会发生改变,变成什么是要根据需求来的。
  • map task将处理后的每一条记录打上标签。打标签的目的就是为了知道这一条记录将来会被哪个reduce task处理。打标签也就是分区,分区是由分区器执行的,默认的分区器是HashPartitioner,分区的策略是,根据记录的key的HashCode与reduce task个数取模。
  • map task将记录打上标签以后,会将其写入到内存buffer中。进入buffer之后的每一条记录是由三部分组成:分区号,key,value。map task一条一条的往buffer中写,一旦写入到达80M,此时它会将这80M内存封锁,封锁后对内存中的数据进行combiner(小聚合),然后排序。排序的规则是,先按照分区号排序,分区号相同的按照key来排序(就是比较key的ASCII码的大小)。以上的combiner以及排序完成后就开始溢写数据到磁盘上,此时的磁盘文件就是一个根据分区号分好区的,并且内部有序的文件。每进行一次溢写就会产生一个磁盘小文件。
  • map task计算完毕后,会将磁盘上的小文件合并成一个大文件,在合并的时候会使用归并排序的算法,将各个小文件合并成一个有序的大文件。(这一步和上面一步统称为shuffle write阶段)。
  • 每一个map task都会经历以上的步骤,也就是每一个map task都会产生一个有分区的并且分区内部有序的大文件。
  • reduce task去map端读取分区号相同的数据,将分区数据写入到内存中,内存满了就会溢写,溢写之前会进行排序(根据key的ASCII码)。当把所有的数据拉取过来后,会将溢写产生的磁盘小文件合并,并且归并排序成一个有序的大文件。为什么要产生一个有序的大文件,就是为了提高分组的效率。
  • 整个过程一共进行了四次排序,这四次排序都是为了提高分组的效率。
  • 最后就是把key相同的分为一组,每一组数据调用reduce函数,产生结果。这些结果都放在一个文件中。
  • 有几个分区就会产生几个结果文件。不必合并在一起。

你可能感兴趣的:(分布式计算原理)