Yarn 资源管理和调度|青训营笔记

309 阅读5分钟

这是我参与「第四届青训营 」笔记创作活动的第22天

青训营已经接近尾声了,项目也要开始开展了,后面可能会更一些项目方面的文章,好了废话少说,继续更文

yarn是什么

  yarn是Hadoop 2.0中的资源管理系统,它的基本思想是将JobTracker 的两个主要功能(资源管理和作业调度/监控)分离,主要方法是创建一个全局的ResourceManager(RM)和若干个针对应用程序的ApplicationMaster(AM)。其中RM负责整个系统的资源管理和分配,而AM负责单个应用程序的管理。这里的应用程序指的是传统的Mapreduce作业或作业的DAG(有向无环图)。

Yarn组件

 1.RsourceManager

  RM是一个全局的资源管理器,管理整个集群的计算资源,并将这些资源分配给应用程序。包括:

  • 与客户端交互,处理来自客户端的请求。
  • 启动和管理applicationManager(AM),并在它失败的时候重新启动它。
  • 管理NodeManager,接收来自NodeManager的资源汇报信息,并向NodeManager下达管理指令
  • 资源管理与调度,接收来自AM的资源申请请求,并为之分配资源。

RM 关键配置参数:

  最小容器内存:yarn.scheduler.mininum-allocation-mb

  容器内容容量:yarn.scheduler.increment-allocation-mb

  最大容器内存:yarn.scheduler.maxinum-allocation-mb

2.ApplicationMaster(AM)

  应用程序级别的,管理运行在YARN上的应用程序。包括:

  • 用户提交的每个应用程序均包含一个AM,它可以运行在RM以外的机器上。
  • 负责与RM调度器协商以获取资源(以container表示)
  • 将得到的资源进一步分配给内部的任务(资源的二次分配)
  • 与NodeManager通信以启动或停止任务
  • 监控所有任务运行状态,并在任务运行失败时重新为任务申请资源以重启任务

3.NodeManager

  YARN的每个节点上的代理,管理HADOOP集群中单个计算节点。包括:

  • 启动和监视节点的计算容器(container)
  • 以心跳的形式向RM汇报本节点上的资源使用情况和各个container的运行状态(cpu和内存等资源)
  • 接收并处理来自AM的container 启动/停止等各种请求

4.container

  container是YARN中抽象的资源,它封装了某个节点上的多纬度资源,如内存、cpu、磁盘、网络等。

container由AM向RM申请的,有RM种的资源调度器异步分配给AM。container的运行是由AM向资源所在的nodeManager发起。

一个应用程序所需的container分为两大类:

  1. 运行AM的container:这是由RM申请和启动的,用户提交应用程序是,它可以指定唯一的AM所需的资源
  2. 运行各类任务的container:这是由AM向RM申请的,由AM与NodeManager通信来启动

以上两类Container可能在任意节点上,他们的位置通常是随机的,即AM可能与它管理的任务运行在一个节点上。

Resource Manager

整体架构

主要功能

总的来说,RM 负责集群所有资源的统一管理和分配,接收各节点汇报信息并按照一定策略分配给各个任务;

  • 与客户端交互,处理来自客户端的请求
  • 启动和管理 AM,运行失败时自动重试
  • 管理所有 NM,接收 NM 的汇报信息并下达管理指令
  • 资源管理与调度

    • 将资源按照一定方式组织起来,例如:资源池
    • 将任务按照一定方式组织起来,例如:队列
    • 接收来自各个 AM 的资源请求
    • 按照一定分配策略将资源分配给 AM

Node Manager

整体架构

主要功能

总的来说,NM 是节点代理,从 AM 接受命令(启停 Container)并执行,通过心跳方式向 RM 汇报节点状态并领取命令(清理 Container)。

  • 与 RM 交互

    • 心跳汇报节点健康状况和 Container 运行状态;
    • 领取 RM 下达的命令;
  • 与 AM 交互

    • 启动容器
    • 停止容器
    • 获取容器状态

重要机制

公平性保障

Fair Share 调度策略

什么是 Fair Share 调度策略?

队列配置 minShare 和 maxShare,当队列空闲时按照一定策略将资源分配给其他活跃队列;

为什么需要 Fair Share 调度策略?

保障公平的前提下实现队列间资源共享,提高资源利用率,缓解繁忙队列压力;

两种类型 Fair Share
  • Steady Fair Share: TotalResource * S.weight
  • Instantaneous Fair Share:

    • 定义

      • 所有队列 Fair Share 之和 <= TotalResource;
      • S.minShare <= Fair Share <= S.maxShare;
    • 目标

      • 找到一个 R 使其满足:
      • R * (All S.wieght)<= TotalResource;
      • S.minShare <= R * S.weight <= S.maxShare;
    • 结果

      • 若 S.minShare > R * S.weight, Fair Share = S.minShare
      • 若 S.maxShare < R * S.weight,Fair Share = S.maxShare
      • 其他 Fair Share = R * S.weight
Fair Share 计算逻辑
  • 计算 Total Resource
  • 初始化 R 上限 RMax

    • 获取所有 non-fixed Schedulable 的 maxShare
    • 初始化 R 为 1,每次翻倍
    • 直到所有 Schedulable 分完所有资源
  • 通过二分法寻找 R [0,RMax]

    • mid = (left + right) / 2.0
    • 若 plannedResourceUsed == totalResource,right = mid;
    • 若 plannedResourceUsed < totalResource,left = mid;
    • 若 plannedResourceUsed > totalResource,right = mid;
  • 计算 Fair Share

    • 若 S.minShare > right * S.weight, Fair Share = S.minShare;
    • 若 S.maxShare < right * S.weight, Fair Share = S.maxShare;
    • 其他情况 Fair Share = right * S.weight Yarn中的steady fair share值和Instaneous Fair Share值都代表了当前分配给这个队列的最大资源值,也是队列在任何时候资源使用量不可以超过的值 ,但是他们存在区别。

对于Fair Share,是一个静态值,是Yarn根据每个队列的minShare、maxShare和weight的配置计算得到的理论上应该分配给这个队列的最大资源,它与这个队列当前是否有app正在运行无关,只和我们在fair-scheduler.xml中的配置有关。

而Instaneous fair share则不同,它是根据当前集群中队列的运行状态的变化而实时变化的,即,如果一个队列上没有任何一个app在运行,即这个队列是inactive队列,那么,这个队列的instaneous fair share值是0,剩余的active队列会对集群资源进行瓜分,显然,如果集群中有队列从active变为inactive,那么剩余这些队列瓜分到的instaneous fair shared都会随之变大,反之,如果有一个队列从inactive变为active,则剩余每个队列的instaneous fair share会随之变小,即instaneous fair share会变小。

因此,yarn运行过程中实际上是用instaneous fair share值作为队列当前最大可使用的资源。比如,我们在为一个ApplicationMaster分配container的时候,必须保证不超过我们配置的maxAMShare值: Resource maxAMResource = Resources.multiply(getFairShare(), maxAMShare);用的就是Instaneous fair share作为当前队列最大可使用资源,然后乘以maxAMShare,获得队列最大可用来运行ApplicationMaster的资源量

DRF 调度策略

为什么需要 DRF 调度策略?

在保证公平性的前提下进行资源降维,以达到更好的分配效果;

什么是 DRF 调度策略?

  • DRF 是最大最小公平算法在多维资源上的具体实现;
  • 旨在使不同用户的“主分享量”最大化的保持公平;

最大最小公平算法:最大化最小资源需求的满足度

  • 资源按照需求递增的顺序进行分配;
  • 用户获取的资源不超过自身需求;
  • 对未满足的用户,等价分享剩余资源;

例如下面场景:A B C D 四个用户的资源需求分别是 2、2.6、4、5份,现在总共有 10 份资源,首先将所有资源均分,每个用户得到 2.5 份资源。对于 A 用户多分配 0.5 份,继续将这 0.5 份资源平均分配给 B C D,B 用户得到 2.666 份资源。会继续将 B 多分配的 0.066 份资源平均分配给 C 和 D。

DRF 调度策略示例
  • 场景:系统有 <9CPU, 18G>,A 每个任务需要 <1CPU,4G>,B 每个任务需要 <3CPU,1G>,对于 A 因为:1/9 < 4/18,所以 A 任务的主资源是内存,B 任务的主资源是 CPU;
  • 数学模型:一定约束条件下的最优化问题,下面 x 代表 A 任务的个数,y 代表 B 任务的个数

    • 最大化资源分配 max(x,y)

    • 约束条件:

      • (x+3y)<=9(CPU约束);
      • (4x+y)<= 18(内存约束);
      • 4x/18 == 3y/9(主资源公平约束);
  • 最终计算得到: x=3,y=2

在上面这个图来说,优先呢因为对于A ,B 来说他们最开始都是0所以不管A,B谁先开始都是可以的,这里就是B先开始,先占CPU的1/3,然后是A开始暂用内存2/9,会发现2/9小于1/3,所以A继续占用,依次类推得到最后的结果