Hadoop学习解析之资源管理调度框架YARN
YARN(Yet Another Resource Negotiator)背景
Yarn的出现是为了解决以下问题(即MapReduce1.0的缺陷):
- 单点故障。
- JobTracker“大包大揽”导致任务过重。
- 容易出现内存溢出。
- 资源划分不合理。
YARN的设计思路
基本思路就是“放权”,即不让 JobTracker 这一个组件承担过多的功能,把原 JobTracker 三大功能(资源管理、任务调度和任务监控)进行拆分,分别交给不同的新组件去处理。重新设计后得到的 YARN 包括 ResourceManager、ApplicationMaster 和 NodeManager,其中,由 ResourceManager 负责资源管理,由ApplicationMaster 负责任务调度和监控,由 NodeManager 负责执行原 TaskTracker 的任务。通过这种“放权”的设计,大大降低了 JobTracker 的负担,提升了系统运行的效率和稳定性。
![架构设计思路 架构设计思路](./images/1574997207018.png)
YARN体系结构
YARN 体系结构中包含了三个组件:ResourceManager、ApplicationMaster 和 NodeManager。各个组件的功能如下表所示:
组件 | 功能 |
---|---|
ResourceManager | 1. 处理客户端请求 2. 启动/监控 ApplicationMaster 3. 监控 NodeManager 4. 资源分配与调度 |
ApplicationMaster | 1. 为应用程序申请资源,并分配给内部任务 2. 任务调度、监控与容错 |
NodeManager | 1. 单个节点上的资源管理 2.处理来自 ResourceManger 的命令 3. 处理来自 ApplicationMaster 的命令 |
- ResourceManager(RM)是一个全局的资源管理器,负责整个系统的资源管理和分配,主要包括两个组件,即调度器(Scheduler)和应用程序管理器(Applications Manager)。
- 应用程序管理器(Applications Manager)负责系统中所有应用程序的管理工作,主要包括应用程序提交、与调度器协商资源以启动ApplicationMaster、监控 ApplicationMaster 运行状态并在失败时重新启动等。
- NodeManager 是驻留在一个 YARN 集群中的每个节点上的代理,主要负责容器生命周期管理,监控每个容器的资源(CPU、内存等)使用情况,跟踪节点健康状况,并以“心跳”的方式与 ResourceManager 保持通信,向 ResourceManager 汇报作业的资源使用情况和每个容器的运行状态,同时,它还要接收来自 ApplicationMaster 的启动/停止容器的各种请求。
NodeManager 主要负责管理抽象的容器,只处理与容器相关的事情,而不具体负责每个任务(Map 任务或 Reduce 任务)自身状态的管理,因为这些管理工作是由ApplicationMaster 完成的,ApplicationMaster 会通过不断与 NodeManager 通信来掌握各个任务的执行状态。YARN 中的容器代表了 CPU、内存、网络等计算资源 - ApplicationMaster 的主要功能:
- 当用户作业提交时,ApplicationMaster 与 ResourceManager 协商获取资源,ResourceManager 会以容器的形式为 ApplicationMaster 分配资源;
- 把获得的资源进一步分配给内部的各个任务(Map 任务或 Reduce 任务),实现资源的“二次分配”;
- 与NodeManager 保持交互通信进行应用程序的启动、运行、监控和停止,监控申请到的资源的使用情况,对所有任务的执行进度和状态进行监控,并在任务发生失败时执行失败恢复(即重新申请资源重启任务);
- 定时向 ResourceManager 发送“心跳”消息,报告资源的使用情况和应用的进度信息;
- 当作业完成时,ApplicationMaster 向 ResourceManager 注销容器,执行周期完成。
YARN的工作流程
在 YARN 框架中执行一个 MapReduce 程序时,从提交到完成需要经历如下 8 个步骤:
- 步骤 1:用户编写客户端应用程序,向 YARN 提交应用程序,提交的内容包括ApplicationMaster 程序、启动 ApplicationMaster 的命令、用户程序等。
- 步骤 2:YARN 中的 ResourceManager 负责接收和处理来自客户端的请求。接到客户端应用程序请求后,ResourceManager 里面的调度器会为应用程序分配一个容器。同时,ResourceManager 的应用程序管理器会与该容器所在的 NodeManager 通信,为该应用程序在该容器中启动一个 ApplicationMaster。
- 步骤 3:ApplicationMaster 被创建后会首先向 ResourceManager 注册,从而使得用户可以通过 ResourceManager 来直接查看应用程序的运行状态。接下来的步骤4~7 是具体的应用程序执行步骤。
- 步骤 4:ApplicationMaster 采用轮询的方式通过 RPC 协议向 ResourceManager 申请资源。
- 步骤 5:ResourceManager 以“容器”的形式向提出申请的 ApplicationMaster 分配资源,一旦 ApplicationMaster 申请到资源后,就会与该容器所在的NodeManager 进行通信,要求它启动任务。
- 步骤 6:当 ApplicationMaster 要求容器启动任务时,它会为任务设置好运行环境(包括环境变量、JAR 包、二进制程序等),然后将任务启动命令写到一个脚本中,最后通过在容器中运行该脚本来启动任务。
- 步骤 7:各个任务通过某个RPC 协议向ApplicationMaster 汇报自己的状态和进度,让 ApplicationMaster 可以随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务。
- 步骤 8:应用程序运行完成后,ApplicationMaster 向 ResourceManager 的应用程序管理器注销并关闭自己。若 ApplicationMaster 因故失败,ResourceManager中的应用程序管理器会监测到失败的情形,然后将其重新启动,直到所有的任务执行完毕。
![YARN的工作流程 YARN的工作流程](./images/1574999237132.png)
YARN的发展目标
发展成为集群中统一的资源管理调度框架,在一个集群中为上层的各种计算框架提供统一的资源管理调度服务。
YARN 的目标就是实现“一个集群多个框架”,即在一个集群上部署一个统一的资源调度管理框架 YARN,在 YARN 之上可以部署其他各种计算框架(包括 MapReduce、Tez、HBase、Storm、Giraph、Spark、OpenMPI 等),由 YARN 为这些计算框架提供统一的资源调度管理服务,并且能够根据各种计算框架的负载需求,调整各自占用的资源,实现集群资源共享和资源弹性收缩。通过这种方式,可以实现一个集群上的不同应用负载混搭,有效提高了集群的利用率,同时,不同计算框架可以共享底层存储,在一个集群上集成多个数据集,使用多个计算框架来访问这些数据集,从而避免了数据集跨集群移动,最后,这种部署方式也大大降低了企业运维成本。
目前,可以运行在 YARN 之上的计算框架包括离线批处理框架 MapReduce、内存计算框架 Spark、流计算框架 Storm 和 DAG 计算框架 Tez 等。
参考:
厦门大学林子雨编著-大数据技术原理与应用-电子书-第15章-Hadoop架构再探讨(2016年4月13日版本).pdf