Hadoop- yarn notes

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

YarnRPC协议图

Hadoop- yarn notes_第1张图片
img

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申请注销并关闭自己。

以上这些步骤只是文字版本的描述,后续介绍状态机时,会再重新梳理每个步骤对应的状态改变,目前只是有个逻辑概念即可。

Yarn应用工作流程

Hadoop- yarn notes_第2张图片
img

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
  1. 发送注册请求 ,包括IPC address 和URL等信息
  2. 响应注册,返回可用信息,包括Yarn接受的资源大小返回,ACL
  • ApplicationMaster注册成功
    ApplicationMaster<------> ResourceManager
  1. 心跳通信,确认他的活跃和健康状况
  • 资源请求
    ApplicationMaster<------> ResourceManager
  1. 请求格式:ResourceRequest
    <请求优先级,资源分配位置,资源大小即每个container要求的大小,container数目,relaxLocality参数>
  2. 返回数据,返回可用资源列表
  • Container启动
    ApplicationMaster<------> NodeManager
  1. 构建ContainerLaunchContext对象,然后和NodeManager交互,启动Container。
  2. 返回成功启动的Container列表,<失败的StartContaineerrequest Container ID, 异常>映射列表,allServicesMetaData映射。
  • Container停止
    ApplicationMaster<------> NodeManager
  1. ApplicationMaster发送StopContainersRequest请求到NodeManager。 参数:ContainerID
  2. NodeManager通过StopContainersResponse进行回应。
  • Container完成
    Resourcemanager<------>ApplicationMaster
  1. container结束时,ResourceManager以事件的形式告知master。
  • ApplicationMaster的失败和恢复
    当失败的时候,ResourceManager 简单的重新启动一个新的ApplicationMaster来启动应用程序。

  • 协调和输出提交

ApplicationMaster的任务包含协调Container如果支持多个container争夺共享资源或提交输出。 那么AM应该保证只允许一个输出或者访问资源。其他终止或者等待。

Container

Yarn中的container代表在应用中的一个工作单元。Container被影射到底层操作系统的进程。

你可能感兴趣的:(Hadoop- yarn notes)