Yarn 的组成及其工作流程

在 Hadoop1 中 MapReduce 框架即负责集群的资源调度,还负责 MapReduce 程序的运行。由于这种架构资源调度和计算高度耦合,导致了一个 Hadoop 集群中只能跑 MapReduce 计算任务,无法跑其它的计算任务,维护成本很高。

在后面的 Hadoop2 中改成了 Yarn + MapReduce 架构,将资源的调度工作交给了 Yarn,MapReduce 只负责计算。这样就能保证 Hadoop 集群技能跑 MapReduce 计算任务,还能跑任何支持 Yarn 资源调度的计算任务,比如 Spark,Storm 等。

Yarn 的架构图如下:

一,Yarn 的组成

从图上可以看出 Yarn 是由两个部分组成:

1,资源管理器 (ResourceMananger)。负责整个集群的资源管理和分配;

2,节点管理器 (NodeManager)。基本上和 HDFS 的 DataNode 进程同时出现,负责具体服务器的资源和任务管理。

ResourceManager 又包含两个重要组件:

1,调度器。其实就是一个资源调度算法,根据应用程序提交的资源申请和当前集群的资源情况进行资源分配。Yarn 进行资源分配的单位是容器 (Container),每个容器包含一定量的内存,cpu 等计算资源。容器是由调度器分配,由 NodeManager 启动和管理,NodeManager 会监控每个节点的容器运行情况并向 ResourceManager 汇报;

2,应用程序管理器。主要负责应用程序的提交,监控应用程序运行状态等。应用程序启动后会在集群中启动一个 ApplicationMaster ,ApplicationMaster 也运行在容器中,后续由 ApplicationMaster 根据应用程序的资源需求进一步向 ResourceManager 申请资源,申请到资源后,分发应用程序代码到各个节点的容器上运行,进行分布式计算。

二,Yarn 的工作流程

以一个具体的 MapReduce 程序为例,分析 Yarn 的整个工作流程:

1,我们向 Yarn 集群提交我们的应用程序,包括 MapReduce ApplicationMaster、MapReduce 程序、MapReduce 程序启动命令;

2,ResourceManager 进程和 NodeManager 进程进行通信,根据集群的资源情况,分配第一个 Container 给集群的某个 NodeManager,NodeManager 启动 Container;

3,ResourceManager 将 MapReduce ApplicationMaster 分发到刚才启动的 Container 上,并在容器中启动;

4,MapReduce ApplicaitonMaster 启动之后立刻向 ResourceManager 注册,并且为 MapReduce 程序申请资源;

5,MapReduce ApplicationMaster 申请到容器之后立刻和对应的 NodeManager 通信,将用户的 MapReduce 程序分发到对应的 Container 中运行,这里运行的就是 Map 进程或者 Reduce 进程;

6,Map 或者 Reduce 任务在运行期间会向 MapReduce ApplicationMaster 进行通信,汇报自己的运行状态,如果运行结束,MapReduce Application 会向 ResourceManager 注销并释放所有的容器资源。

这里可以看出,Yarn 不会和 MapReduce 有任何的耦合,Yarn 只会和 MapReduce ApplicationMaster 进行通信。由 MapReduce ApplicationMaster 做 MapReduce 程序和 Yarn 的桥梁。这里的 MapReduce ApplicationMaster 是 MapReduce 实现了 Yarn 的接口规范实现的。