Yarn源码分析1-设计理念与基本架构
《Hadoop技术内幕-深入解析YARN架构设计与实现原理》学习笔记
Yarn源码小组讨论班
2018-01-12
本文内容属于《Hadoop技术内幕-深入解析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命令的一个示例
- UnmanagedAM:AM不在集群内的情况示例
- 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/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-api/src/main/java/org/apache/hadoop/yarn/api/ApplicationClientProtocol.java
- admin与RM:(ResourceManagerAdministrationProtocol)
- Admin通过该RPC更新系统配置文件,比如节点黑白名单、用户队列权限等
- 源码位置:hadoop/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/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/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/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申请注销并关闭自己。
以上这些步骤只是文字版本的描述,后续介绍状态机时,会再重新梳理每个步骤对应的状态改变,目前只是有个逻辑概念即可。
4 多个视角来看Yarn
下面从并行编程、资源管理、云计算三个视角来看一下Yarn.
并行编程:
- 在单机上想更快的处理一份大数据集,一般需要使用多线程,大体流程一般是先由操作系统启动一个主线程,再由主线程负责数据切分、任务分配、子线程启动和销毁。
- Yarn应用其实与此类似,这里可以把Yarn看成是一个云操作系统,它负责为应用启动AM(相当于单机的主线程),然后再由AM去负责数据切分、任务分配、启动和监控等工作。
资源管理系统:
- 每种计算框架都有自己的优势,在没有哪一家都独霸天下之前,共存会是长态,如果各自使用一套集群,资源的利用率肯定是不如将所有计算资源统一抽象来使用的。
- YARN就是这样一个资源管理系统,它的出现弱化了计算框架之争,把计算框架与机器之间非常友好的隔离了一层(但是这样也会带来一些问题,比如Spark没有办法跑粗粒度等)
云计算:
- IaaS(Infrastructure-as-a-Service):基础设施即服务。
- 基础设施包括:物理机、虚拟机、存储空间、网络连接、负载均衡、防火墙等基本计算资源。
- 用户在这些基础之上部署和运行各种软件,包括操作系统和应用程序等
- PaaS(Platform-as-a-Service):平台即服务。
- 平台包括:操作系统、编程语言运行环境、数据库、Web服务器等
- 用户可以平台上部署和运行自己的应用,通常而言,用户不能管理和控制底层的基础设施
- SaaS(Software-as-a-Service):软件即服务。
- 用户无需购买软件,而是直接向提供商租用基本Web的软件,和管理企业经营活动。
从云的分层概念上来看,YARN可以被认为是PaaS层,它能为不同类型的应用提供统一的管理和调度。
- IaaS(Infrastructure-as-a-Service):基础设施即服务。