Yarn源码分析1-设计理念与基本架构

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层,它能为不同类型的应用提供统一的管理和调度。