Yarn基础架构
1 YARN产生背景
最早的hadoop是由hdfs和mr组成的,hdfs负责存储,mr负责计算。
1.1 MRv1的局限性
- 扩展性差:mr中的jobTracker同时负责资源管理和作业控制两个功能,成为瓶颈。
- 可靠性差:mr中的master是单点的
- 资源利用率低:基于槽的资源分配模型,通常一个任务不会用完一个槽位,并且Map slot和Reduce slot无法共享
- 无法支持多种计算框架
1.2 Yarn的诞生
传统的MR已经无法满足通用的计算需求,新的计算框架层出不穷,对于一家公司来说,希望能有一个统一的资源平台,在上面跑各种类型的计算任务,YARN就诞生了。
YARN(Yet Another Resource Negotiator,另一种资源协调者)是一种新的Hadoop资源管理器,它是一个通用资源管理系统,可为上层应用提供统一的资源管理和调度,它的引入为集群在利用率、资源统一管理和数据共享等方面带来了巨大好处。
- MRv1和MRv2的区别
- MRv1和MRv2有相同的编程模型和数据处理引擎
- 最主要的不同是运行时环境的不同,MRv2跑在yarn上面,MRv1不被yarn管理
2 YARN的基本架构
yarn是hadoop 2.x的资源管理系统,基本思想是将MRv1中的JobTracker拆分成两个独立的服务:
- ResourceManager:管理全局资源
- ApplicationMaster:每个应用自己的管理器
Yarn相当于是在物理机和计算引擎之间增加了一个资源抽象层。
Tip: 在计算机领域,通过恰当的增加一层基本上可以解决任何问题
2.1 YARN基本组成
Yarn依然是Master/Slave的结构:
- 在资源架构层面,ResourceManager是Master,NodeManager是Slave
- 在应用运行期间,ApplicationMaster是Master,各个Container是Slave
整个Yarn基本上由以下这些角色组成:
ResourceManager(RM),RM是全局的资源管理器,负责整个系统的资源管理和分配。由以下两部分组成:
- 调度器:根据容量、队列限制条件将系统资源分配给各个应用
- 资源分配的单位是container,container是一个动态资源单位,它将内存、CPU、磁盘、网络等资源封装在一起,从而限定了资源使用量。
- 调度器是一个可插拔的组件,用户可以自己定制,也可以选择Fair或Capacity调度器
- 应用程序管理器:负责管理所有应用程序的以下内容:
- 应用提交
- 与调度器协商资源以启动AM
- 监控AM运行状态并在失败时重启它
ApplicationMaster(AM),用户提交的每个应用程序都需要包含一个AM,它的主要功能包括:
- 与RM调度器协商以获取资源(以container为资源单位)
- 将得到的任务进一步分配给内部的任务
- 与NM通信以启动/停止任务
- 监控所有任务运行状态,并在失败时重新为任务申请资源以重启任务
Tips : 当前Yarn已经实现了两个AM:
- DistributedShell:分布式的运行shell命令 - MRAppMaster:MapReduce应用的AM
NodeManager(NM),是每个节点上的资源和任务管理器
- 定时向RM汇报本节点上的资源使用情况和各个container运行状态
- 接收并处理来自AM的container启动/停止等请求
Container,是Yarn中的资源抽象
- 它封装了节点上多个维度的资源(目前Yarn只支持CPU和内存两种资源)
- 它与slot的不同之处在于,slot是静态的(每个slot的资源相同),container是动态的(每个container的资源可以不同)。
2.2 Yarn通信协议
RPC是一个分布式系统的大动脉,徐鹏建议我们,想了解YARN,先从RPC协议开始,了解角色之间通信了哪些内容。
在Yarn中的所有RPC协议,通信双方均有一端是client,另一端是Server,并且Client总是连接Server的。
Yarn中的RPC共有以下5种,分别看一下:
- client与RM:(ApplicationClientProtocol)
- JobClient通过该RPC提交应用程序、查询应用程序状态等
- 源码位置:hadoop-dev/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/ApplicationClientProtocol.java
- admin与RM:(ResourceManagerAdministrationProtocol)
- Admin通过该RPC更新系统配置文件,比如节点黑白名单、用户队列权限等
- 源码位置:hadoop-dev/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/server/api/ResourceManagerAdministrationProtocol.java
- AM与RM:(ApplicationMasterProtocol)
- AM通过该RPC向RM注册和注销自己,并为各个任务申请资源
- 源码位置:hadoop-dev/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/ApplicationMasterProtocol.java
- AM与NM:(ContainerManagementProtocol)
- AM通过该RPC要求NM启动或停止Container,获取各个container的状态等信息
- 源码位置:hadoop-dev/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/ContainerManagementProtocol.java
- NM与RM:(ResourceTracker)
- NM通过该RPC协议向RM注册,并定时发送心跳汇报当前节点的资源使用情况和Container运行情况
- 源码位置:hadoop-dev/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/api/ResourceTracker.java
3 Yarn工作流程
当用户向YARN中提交一个应用程序之后,Yarn分两大阶段运行该应用:
- 第一个阶段是启动AM
- 第二个阶段是由AM创建应用程序,为它申请资源,并监控运行过程,直到运行结束
下面介绍一下包括这两大阶段的完整流程:
- 步骤1:用户向YARN提交应用,其中包括AM、启动AM的命令、用户程序等
- 步骤2:RM为该应用分配第一个Container,并与对应的NM通信,要求它在这个Container中启动应用的AM
- 步骤3:AM向RM注册,这样用户可以通过RM查看应用的状态。然后AM为各个任务申请资源,并监控它的运行状态,直到运行结束,即重复以下步骤4~7
- 步骤4:AM采用轮询的方式通过RPC协议向RM申请和领取资源
- 步骤5:一旦AM获得资源,便与对应的NM通信,要求它启动任务
- 步骤6:NM为任务设置好运行环境(包括环境变量、JAR包、二进制程序等)后,将任务启动命令写到一个脚本中,并通过该脚本启动任务
- 步骤7:各个任务通过某个RPC协议向AM汇报自己的状态和进度,以让AM随时掌握状态,从而可以在任务失败时重启任务
- 步骤8:应用程序运行完成后,AM向RM申请注销并关闭自己。
以上这些步骤只是文字版本的描述,后续介绍状态机时,会再重新梳理每个步骤对应的状态改变,目前只是有个逻辑概念即可。
ApplicationMaster
交互过程:
提交一个请求到resourceManager开始。ApplicationMaster启动向ResourceManager注册。ApplicationMaster向ResourceManager请求Container执行世纪的工作,讲分配的Container告知NodeManager以便ApplicationMaster使用。计算过程在Container中进行。这些Container讲和AppplicationMaster保持通信,并告知任务过程。当应用程序完成后,container被停止。ApplicationMaster从ResourceManager中注销。
主要职责:
- 初始化向ResourceManager报告自己活跃信息的进程
- 计算用用程序的资源需求
- 讲需求转换成Yarn调度器可以理解的ResourceRequest
- 与调度器协商申请资源
- 与NodeManager合作使用分配的container
- 跟踪正在运行的container的状态,监控他们的进程
- 对container或节点失败的情况进行处理。
主要过程:
- ApplicationMaster注册
ApplicationMaster<------> ResourceManager
- 发送注册请求 ,包括IPC address 和URL等信息
- 响应注册,返回可用信息,包括Yarn接受的资源大小返回,ACL
- ApplicationMaster注册成功
ApplicationMaster<------> ResourceManager
- 心跳通信,确认他的活跃和健康状况
- 资源请求
ApplicationMaster<------> ResourceManager
- 请求格式:ResourceRequest
<请求优先级,资源分配位置,资源大小即每个container要求的大小,container数目,relaxLocality参数> - 返回数据,返回可用资源列表
- Container启动
ApplicationMaster<------> NodeManager
- 构建ContainerLaunchContext对象,然后和NodeManager交互,启动Container。
- 返回成功启动的Container列表,<失败的StartContaineerrequest Container ID, 异常>映射列表,allServicesMetaData映射。
- Container停止
ApplicationMaster<------> NodeManager
- ApplicationMaster发送StopContainersRequest请求到NodeManager。 参数:ContainerID
- NodeManager通过StopContainersResponse进行回应。
- Container完成
Resourcemanager<------>ApplicationMaster
- container结束时,ResourceManager以事件的形式告知master。
ApplicationMaster的失败和恢复
当失败的时候,ResourceManager 简单的重新启动一个新的ApplicationMaster来启动应用程序。协调和输出提交
ApplicationMaster的任务包含协调Container如果支持多个container争夺共享资源或提交输出。 那么AM应该保证只允许一个输出或者访问资源。其他终止或者等待。
Container
Yarn中的container代表在应用中的一个工作单元。Container被影射到底层操作系统的进程。