前几章咱们介绍了 Hadoop 的 MapReduce 和 HDFS 两大组件,内容比较基础,看完后能够写简单的 MR 应用程序,也可以用命令行或 Java API 操做 HDFS。但要对 Hadoop 作深刻的了解,显然不够用。所以本章就深刻了解一下 MapReduce 应用的运行机制,从而学习 Hadoop 各个组件之间如何配合完成 MR 做业。本章是基于 Hadoop YARN 框架介绍,YARN(Yet Another Resource Negotiator)是 Hadoop 的集群资源管理器,也是 Hadoop2 的默认资源管理器。为何要用 YARN 框架? 简单来讲 Hadoop1 的时候没有资源管理器,所以在 Hadoop1 集群只能运行 MR 做业。YARN 出现后统一管理集群的资源,所以 Spark、Storm 等其余分布式计算框架也能运行在 Hadoop 集群。同理,除了 YARN 还有其余的资源管理框架,目前比较火的是 k8s。缓存
运行一个 MR 程序主要涉及如下 5 个部分:网络
运行 MR 任务的工做原理以下图,本图摘自《Hadoop 权威指南(第四版)》:
app
步骤1 是咱们在客户端节点(集群中的某台机器)执行 hadoop jar xxx 命令后,启动 MR 做业的流程,后续会涉及如下几个重要流程框架
下面会详细介绍每一个流程。这里咱们将编写的整个 MR 程序叫作做业,MR做业运行后的 map 或 reduce 任务统称为任务。分布式
以上的流程均在客户端节点完成。oop
ResourceManager 收到调用它的 submitApplication() 方法后,会在 NodeManager 中分配一个 container (步骤 5a),在 container 中启动 application master(步骤 5b) 。MapReduce application master 的主类是 MRAppMaster。application master 完成初始化后(步骤 6),从共享文件系统(如:HDFS)获取分片信息(步骤 7)。对每一个分片建立一个 map 任务和 reduce 任务,并分配任务 ID。若是 application master 判断该任务不是 uber 任务,那么接下来会进行任务分配。学习
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)。命令行
当用户成功提交而且做业成功运行后,用户但愿可以看到做业的运行状态。一个做业和它的每一个任务都有一个状态,包括:做业或任务的状态(好比,运行中、成功或失败),map 或 reduce 任务的进度以及计数器值等。orm
流程图以下:
application master 接到最后一个任务成功完成的通知后,便把做业置位成功得状态。能够端查询到任务成功完成后,从 waitCompletion() 方法返回。做业的统计信息和计数器值输出在控制台。最后,application master 会作一些清理工做,做业信息由 JobHistoryServer 存档,以便用户之后查询。
本章主要介绍 MR 做业的运行机制,而且了解了 YARN 集群主从节点职责及其相互之间的配合。经过这篇文章的介绍但愿读者对 MR 做业的运行机制有大体的了解。咱们能够简单总结下本章介绍的相关组件的做用。本文主要参考《Hadoop 权威指南(第四版)》和 Hadoop 官方文档,有兴趣的读者能够深刻研究,一块儿探讨。