运行一个 MR 程序主要涉及如下 5 个部分:html
运行 MR 任务的工做原理以下图,本图摘自《Hadoop 权威指南(第四版)》:
缓存
步骤1 是咱们在客户端节点(集群中的某台机器)执行 hadoop jar xxx 命令后,启动 MR 做业的流程,后续会涉及如下几个重要流程网络
下面会详细介绍每一个流程。这里咱们将编写的整个 MR 程序叫作做业,MR做业运行后的 map 或 reduce 任务统称为任务。app
以上的流程均在客户端节点完成。分布式
ResourceManager 收到调用它的 submitApplication() 方法后,会在 NodeManager 中分配一个 container (步骤 5a),在 container 中启动 application master(步骤 5b) 。MapReduce application master 的主类是 MRAppMaster。application master 完成初始化后(步骤 6),从共享文件系统(如:HDFS)获取分片信息(步骤 7)。对每一个分片建立一个 map 任务和 reduce 任务,并分配任务 ID。若是 application master 判断该任务不是 uber 任务,那么接下来会进行任务分配。oop
application master 会为 map 任务和 reduce 任务向 ResourceManager 申请分配资源。map 任务的优先级高于 reduce 任务,且直到 5% 的 map 任务完成时,reduce 任务请求才能发出。reduce 任务能够在集群的任意机器执行,但 map 任务有数据本地化的限制,理想状况下数据分片和 map 任务在同一节点运行,即数据本地化(data local),这样 map 任务直接读取本地的数据,不须要网络 IO。若是达不到理想状况,能够在数据节点同一机架上启动 map 任务,即机架本地化(rack local),这样 map 任务从同机架上其余节点将数据拷贝到本身的节点。最差的状况是分片和 map 任务不在同一机架,须要跨机架拷贝数据。application master 申请的资源包括内存和 CPU 核心数,申请的大小能够经过 4 个属性指定:spa
ResourceManager 为任务在某个 NodeManager 上分配容器后(步骤 9a),application master 会与该 NodeManager 通讯来启动容器(步骤 9b)。该任务的主类为 YarnChild,该任务运行前会先将共享文件系统(如:HDFS)上的文件本地化(步骤 10),文件包括:配置文件、JAR包和分布式缓存文件。最后,运行 map 或 reduce 任务(步骤 11)。htm
当用户成功提交而且做业成功运行后,用户但愿可以看到做业的运行状态。一个做业和它的每一个任务都有一个状态,包括:做业或任务的状态(好比,运行中、成功或失败),map 或 reduce 任务的进度以及计数器值等。blog
流程图以下:接口
application master 接到最后一个任务成功完成的通知后,便把做业置位成功得状态。能够端查询到任务成功完成后,从 waitCompletion() 方法返回。做业的统计信息和计数器值输出在控制台。最后,application master 会作一些清理工做,做业信息由 JobHistoryServer 存档,以便用户之后查询。
本章主要介绍 MR 做业的运行机制,而且了解了 YARN 集群主从节点职责及其相互之间的配合。经过这篇文章的介绍但愿读者对 MR 做业的运行机制有大体的了解。咱们能够简单总结下本章介绍的相关组件的做用。本文主要参考《Hadoop 权威指南(第四版)》和 Hadoop 官方文档,有兴趣的读者能够深刻研究,一块儿探讨。