vlambda博客
学习文章列表

分布式集群资源调度框架 Yarn

Yarn的发展历史

初始版本

    在Hadoop1.X中,作业提交是通过 TaskTracker 和 JobTracker 通信来完成。这种方案的主要缺点是,服务器集群资源调度管理和 MapReduce 执行过程耦合在一起,如果想在当前集群中运行其他计算任务,比如 Spark 或者 Storm,就无法统一使用集群中的资源了。

改进版本

随着大数据技术家族的发展,各种新的计算框架不断出现,我们不可能为每一种计算框架部署一个服务器集群,所以需要把 MapReduce 的资源管理和计算框架分开,这也是 Hadoop 2 最主要的变化,就是将 Yarn 从 MapReduce 中分离出来,成为一个独立的资源调度框架。

Yarn的基本介绍

    Yarn 包括两个部分:一个是资源管理器(Resource Manager),一个是节点管理器(Node Manager),简称为RM和NM。

    这也是 Yarn 的两种主要进程:RM进程负责整个集群的资源调度管理,通常部署在独立的服务器上;NM进程负责具体服务器上的资源和任务管理,在集群的每一台计算服务器上都会启动,基本上跟 HDFS 的 DataNode 进程一起出现

资源管理器

    资源管理器(RM)包括两个主要组件:调度器和应用程序管理器。

调度器

    调度器其实就是一个资源分配算法,根据应用程序(Client)提交的资源申请和当前服务器集群的资源状况进行资源分配。(Yarn 内置了几种资源调度算法,包括 Fair Scheduler、Capacity Scheduler 等)。你也可以开发自己的资源调度算法供 Yarn 调用。

应用程序管理器

应用程序管理器负责应用程序的提交、监控应用程序运行状态等。

    应用程序启动后需要在集群中运行一个 ApplicationMaster,ApplicationMaster 也需要运行在容器里面。每个应用程序启动后都会先启动自己的 ApplicationMaster,启动后根据应用程序的资源需求进一步向 ResourceManager 进程申请容器资源,得到容器以后就会分发自己的应用程序代码到容器上启动,进而开始分布式计算。

ApplicationMaster

  管理YARN内运行的应用程序的每个实例。主要功能包括数据切分,为应用程序申请资源并进一步分配给内部任务,任务监控与容错等等。

    负责协调来自resourcemanager的资源,并通过nodemanager监视容易的执行和资源使用情况。

节点管理器

    节点管理器(NodeManager)负责启动和管理容器,Yarn 进行资源分配的单位是容器,每个容器包含了一定量的内存、CPU 等计算资源,默认配置下,每个容器包含一个 CPU 核心。容器由 NodeManager 进程启动和管理,NodeManger 进程会监控本节点上容器的运行状况并向 ResourceManger 进程汇报。

Container 

    Container是YARN中的资源抽象,它封装了某个节点上的多维度资源,如内存、CPU、磁盘、网络等,当AM向RM申请资源时,RM为AM返回的资源便是用Container表示的。

    YARN会为每个任务分配一个Container,且该任务只能使用该Container中描述的资源。

Yarn 的工作流程举例

    MapReduce 如果想在 Yarn 上运行,就需要开发遵循 Yarn 的规范;相应地,其他大数据计算框架也可以开发遵循 Yarn 规范ApplicationMaster。

    这样在一个 Yarn 集群中就可以同时并发执行各种不同的大数据计算框架,实现资源的统一调度管理。  

    我们以一个 MapReduce 程序为例,来看一下 Yarn 的整个工作流程

1. 我们向 Yarn 提交应用程序,包括 MapReduce ApplicationMaster、我们的 MapReduce 程序,以及 MapReduce Application 启动命令。

2.ResourceManager 进程和 NodeManager 进程通信,根据集群资源,为用户程序分配第一个容器,并将 MapReduce ApplicationMaster 分发到这个容器上面,并在容器里面启动 MapReduce ApplicationMaster。

3.MapReduce ApplicationMaster 启动后立即向 ResourceManager 进程注册,并为自己的应用程序申请容器资源。

4.MapReduce ApplicationMaster 申请到需要的容器后,立即和相应的 NodeManager 进程通信,将用户 MapReduce 程序分发到 NodeManager 进程所在服务器,并在容器中运行,运行的就是 Map 或者 Reduce 任务。

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