MapReduce如何工作

  

hadoop temperature运行out无结果 hadoop committer_归约

                              (图:*Jomini是我的水印)

 1、Hadoop进行Mapreduce的的五个部分,以下是五个部分:

    (1) 客户端:提交MapReduce工作;

    (2) YARN 资源管理器:协调集群上的计算机资源的分配;

    (3) YARN node 管理器:发动和监视集群里的计算机容器

    (4) MapReduce 主运用(application master): 协调MapReduce的任务,主运用和MapReduce任务在容器上的运行由资源管理器规划和node管理器管理;

    (5)(HDFS)分布式文件系统:用于在实体间分享文件;

 

2、Hadoop 进行MapReduce的过程:

  (1) 提交工作:Job的submit()方法创建一个内部JobSubmitter实例并对此调用submitJobInternal()(步骤1)。提交 job 后,用waitForCompletion()对 job 的进程每秒调查一次并报告控制台进程是否自从最后一次报告后有变化。当 job 完成之后,就会显示 job 计数器。相反,这个error 会提示失败。

                                 

hadoop temperature运行out无结果 hadoop committer_资源管理器_02

        提交工作的过程由 JobSubmitted 通过以下实现:

             - 向资源管理器要求新的申请ID,为了MapReduce Job ID(步骤2);

             - 检查 job 的输出规格。比如,如果输出没有指定或者已经存在,则 job 不能提交并且error会被抛出到MapReduce程序;

             - 计算要分给 job 的输入。如果分给不能计算,job 就不能提交已经抛出错误;

             - 复制运行 job 所需要的资源,包括 job JAR 文件,配置文件,和计算输入分配等;

             - 通过调用 submitApplication() 提交 job;

             

    (2)初始化工作:当资源管理器收到 submitApplication() 方法的调用,就会将请求推给 YARN 调度程序。YARN调度程序就会分配一个容器,并且资源管理器会在node 管理器下启动运用的主进程(步骤 5a 和 5b); MapReduce Job的主应用是Java 应用(主要的类是 MRAppMaster)。通过创建一定数量的对象用来监视 job 的进程来初始化 job,同时从任务中(步骤6)收到进程和完成报告。下一步,从分享文件系统中的客户端收到分片(inputsplit)。之后,为每个分片创造一个映射任务对象和由 mapreduce.job.reduces 特性决定的归约任务对象。在这任务被基于IDs。

        主运用必须决定如何运行构成MapReduce Job的任务。如果Job 是小的,主运用可以选择在相同的JVM 上运行任务。这个发生在当超过了分配和运行任务在性的容器里超过了b并行获得。这样的job称之为uberized。

                                                           

hadoop temperature运行out无结果 hadoop committer_mapreduce_03

    (3)任务分配:如果 job 不满足在uber task 上运行,这样主运用会为了资源管理器里的 job 里映射和归约任务请求容器。对于映射任务的请求会优先于于归约任务,因为所有的映射任务必须在归约任务的排序阶段前完成。对于归约任务的请求不会开始知道5%的映射任务完成。集群里的归约任务可以在任何地方运行,但是映射任务的请求有地点限制。在可以选择的情况下,任务是当地数据的即分在相同的node下。另外的,任务还可能是rack local即在相同的架构,但是不同的node,随之分开。一些任务既不是本地数据的也不是rack local并且从不同的rack取回它们的数据而不是所运行的地方。对于特殊的job运行,可以通过查找job的计数器决定运行在每个位置的任务数量。

        请求也会指定任务的存储要求和CPUs。默认条件下, 每个映射和归约任务分配1024MB的内存和一个虚拟内核。这个值在每个主要成分的job是可配置的(通过mapreduce.map.memory.mb,mapreduce.reduce.memory.mb,mareduce.map.cpu.vcores and mapreduce.reduce.cpu.vcores.)

    (4)任务执行:一旦在一个node上的容器通过资源管理调度任务被给予了资源,主运用通过联系node管理器启动容器。任务由主类是YarnChild的Java运用执行。在任务可以执行之前,这被锁定任务所需要的资源,包括job 配置和JAR 文件,还有其他来自于分布式缓存的文件 。最后,再运行映射或者归约任务。

        YarnChild 运行在专用的JVM上,所以,任何在用户定义映射的bugs和归约函数都不会影响node 管理器。

    (5)进程和状态更新:MapReduce job需要大规模长时间运行。由于时间长,反馈很重要。。。。。

    (6)工作完成: 当主运用收到最后任务完成的提示,这就改变job的状态到成功。然后,打印信息告诉用户并且从 waitForCompletion() method返回。Job的统计和计数会在控制台显示。