这是我参与「第四届青训营 」笔记创作活动的第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分为两大类:
- 运行AM的container:这是由RM申请和启动的,用户提交应用程序是,它可以指定唯一的AM所需的资源
- 运行各类任务的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继续占用,依次类推得到最后的结果