map reduce1.0简析

第一代 map reduce 原理简析。

不废话,上图。

map reduce原理图

上图为第一代map reduce原理图。左侧为map阶段,右侧为reduce阶段。

map和reduce各为一个进程。

先看左侧map阶段

map的数据存在于HDFS中,经过input format后,读入缓冲区,利用溢写机制不断将缓冲区中的数据写到磁盘上。当所有数据都写到磁盘上后,会进行一次merge合并,merge期间会进行排序。因此merge后的数据是有序的数据。

下面详细说下map各个阶段:

  • File:原始数据文件都存于HDFS中,每个文件切成多个一定大小(默认64M)的Block(默认有3个备份,分别存于多个节点上)。
  • InputFormat:它是MR的基础框架之一。主要有两个作用:数据分割split以及记录读取器。

    • 数据分割split(Data Splits):它是数据的实际存储,即物理存储。有了它,可以解决跨Block的问题(属于前一个Block对应的split)。实际上,每一个split都可能包含后一个Block中开头部分的数据(即一个完整的文件大于64M时,会被分开成多个Block)。
      它主要做两件事:①分割split;②记录split的record(包含下一个block的开头部分)
    • 记录读取器(Record Reader,即RR):它是逻辑存储,即映射表。每读取一条记录,调一次map函数(RR只是单纯读记录,文件的跨Block记录数据存储地址数据是在Data split记录的)。
  • map:这个是map函数,和map进程不是一回事。如果从RR读取到的数据是 “I love China”,那么,经过map函数后,结果会成为{"I",1},{"love",1},{"China",1}。也就是说,会将读取到的数据切分,转成{"word",1}的格式。然后将它们增加到内存中。
  • buffer in memory:内存缓冲区。它的默认大小是100M,当数据占到80%(溢写阈值)时,会将内存中数据转存到磁盘上,同时还会有20%的剩余空间,map函数还会不断将数据写到这20%的空间中。
  • partition:分区。它决定数据最终由哪个reduce来处理。例如采用hash方式对key取模,最终生成{partition,key,value},就可以知道这个key会由哪个reduce处理。
  • sort:排序。对key进行排序,默认采用快排。
  • spill:内存缓冲区达到阈值时,溢写的线程会锁住这80%的缓冲区,将这些数据写到磁盘中,然后释放内存。每次溢写会生成一个数据文件。
  • combiner:数据合并。将相同key的value值合并,减少输出传输量。它实际上是reduce函数。一般combiner会发生在溢写过程和合并过程(网络传输前)。
  • merge:将本机磁盘上的多个分区的数据文件进行合并(合并可能有多次)。默认归并排序。

map部分大概这么多,我们常说的shuffle阶段,包括:partition、sort、spill、merge、combiner、copy、memory、disk...经常情况下,进行优化的部分就是shuffle阶段。

再看看右侧reduce阶段

  • merge:这些merge的数据来自多个map进程,不在本机的数据会通过网络传输传过来。同样地,也会采用归并排序。多个map task相同partition的数据会由同一个reduce处理。它的合并会由多次。
  • reduce:最终进行汇总。一个reduce会生成一个文件。

reduce阶段相对来说简单些。

下面有几个小点:

  • map reduce的过程是同步过程,只有当map执行完,才执行reduce。
  • partition的个数由指定的reduce个数决定的。(可以是reduce个数的倍数)

在map reduce1.0中,由两个重要进程:

  • JobTracker:主进程。

    • 它接受客户作业,进行任务调度,提供节点监控状态,任务进度的管理等。
    • 一个mapreduce集群有一个jobtracker。
    • tasktracker用周期性心跳(默认3s)通知jobtracker自己的健康状态,心跳包含可用的map和reduce任务数、占用的数目、运行中的任务详细信息。
    • jobtracker使用一个线程池同时处理心跳和客户请求。
  • TaskTracker:任务进程。

    • 由jobtracker指派任务,周期心跳汇报(健康状态、询问任务)
    • 每一个工作节点永远只有一个tasktracker。
    • jobtracker一直等待jobclient提交作业。

mapreduce作业调度默认采用先进先出队列调度模式(FIFO):

  • 优先级:very_high、high、normal、low、very low
阅读 249

推荐阅读
目录