因为目前大部分公司采用的为YARN调度框架,所以本篇文章只针对MapReduce2进行阐述。

一、MapReduce作业运行流程

    MapReduce运行的工作原理

          图   Hadoop使用YARN运行MapReduce的过程(图片截取自Hadoop权威指南)

       1、通过Job的submit()方法创建一个JobSummiter实例,并且调用其submitJobInternal()方法。

       2、作业提交给ResourceManager,从ResourceMananger处得到一个ApplicationID

       3、JobClien检查Job的输出说明,计算输入分片,并将Job资源(包括运行的Jar包、配置和分片信息)复制到HDFS

       4、通过ResourceManager上的submitApplications进行作业提交 

       5、ResourceManager收到submitApplication()消息后,便将请求传递给调度器(scheduler)。调度器为其分配一个容器(Container),然后资源管理器在节点管理器(NodeManger)的管理下在Container中启动应用程序的master

        6、初始化Job:通过创建多个簿记录对象以保持对作业进度的跟踪,因为它将接受来自任务的进度和完成报告

        7、接受HDFS在Client端计算的输入分片信息

        8、连接ResourceManager,向ResourceManager进行资源申请

        9、Application master 通过与节点管理器(NodeManager)进行通信启动Container,该任务有主类为YarnChiled的Java程序执行。

        10、在第9步之前,需要将任务需要的资源本地化,包括运行的Jar包、配置和分片信息和HDFS的文件

        11、最后运行map任务或reduce任务。

二、Map、Reduce任务中Shuffle和排序的过程     

        1、Map端

           每个map任务都有一个环形内存缓冲区用于存储任务的输出。在默认情况下,缓冲区的大小为100MB,此值可以通过io.sort.mb属性来调整。一旦缓冲内容达到阈值(io.sort.spill.percent,默认为0.80,或者80%),一个后台线程便开始把内容溢出到(spill)磁盘。在溢出写到磁盘过程中,map输出继续写到缓冲区,但如果在此期间缓冲区被填满,map会被阻塞直到写磁盘过程完成。

            溢出写过程按轮询方式将缓冲区的内容写到mapred.local.dir属性指定的作业特定子目录中的目录中。

             在写磁盘之前,线程首先根据数据最终要穿的reducer把数据划分成相应的分区(partition)。在每个分区中,后台线程按键(key)进行内排序,如果有Combiner,它就在排序后的输出上运行。运行Combiner使得map输出结果更紧凑,因此减少写到磁盘的数据和传递给reducer的数据。

       map输出数据到reduce时,可将map输出的数据进行压缩,默认情况下是不进行压缩的,需要通过mapred.conpress.map.output设置为true,使用的压缩库有mapred.map.output.compression.codec指定。这样可以减少传给reduce的数据量。

          2、Reduce端

             Reduce会接收到不同map任务传来的数据,并且每个map传来的数据都是有序的。如果reduce端接收的数据量相当小,则直接存储在内存中(缓冲区大小由mapred.job.shuffle.input.buffer.precent属性控制,指定用于此用途的对空间百分比),否则,map输出被复制到磁盘。一旦内存缓冲区达到阈值大小或达到map输出阈值(由mapred.inmen.merge.threshold控制),则合并后溢出写到磁盘中。如果指定Combiner,则在合并期间运行它,以降低写入硬盘的数据量。

             随着磁盘上副本的增多,后台线程会将它们合并为更大的、排好序的文件。这会为后面的合并节省一些时间。注意,为了合并,压缩的map输出(通过map任务)都必须在内存中被解压缩。

            复制完所有的map输出后,renduce任务进入排序阶段(即合并阶段),这个阶段将合并map输出,维持其顺序排序。这是循环进行的。比如,如果有50个map输出,而合并因子是10(10为默认设置,有io.sort.factor属性设置,和map的合并类似),合并将进行5趟。每趟将10个文件合并成一个文件,因此最后有5个中间文件(在这里注意轮询的规则,下图中有详解)。

             最后阶段,即reduce阶段,直接把数据输入reduce函数。在reduce阶段,对已经排序输出中的每个键调用reduce函数。此阶段的输出直接写到输出文件系统。

             MapReduce运行的工作原理

            

以上内容为本人对《Hadoop权威指南》中MapReducer的一些总结,不足之处请多包涵。


            

    




        







相关文章: