历史学习笔记
本期重点学习程序与YARN的交互流程
程序与YARN交互流程
核心交互流程

以MapReduce为例, 对照官方架构图, YARN的核心交互流程主要包括以下几部分:
MR作业提交 Client -->RM
资源申请 AppMstr-->RM
MR作业状态汇报 Container(Map|Reduce Task) --> Container(MRAppMstr)
节点状态汇报 NM -->RM
交互流程概述
当用户向YARN中提交一个应用程序后,YARN将分两个阶段运行该程序
第一个阶段:客户端申请资源启动运行本次程序的ApplicationMaster
第二个阶段:ApplicationMaster根据本次程序内部具体情况,为它申请资源,并监控程序的整个运行过程,直到运行完成。
注:任何程序提交到YARN上运行,必须首先运行ApplicationMaster
交互流程详解
以提交MR程序为例,展示与YARN交互流程

ApplicationMaster是整个程序运行过程中的绝对老大。
YARN资源调度器Scheduler
YARN的交互流程中的第4步其实是AM与RM中的资源调度器在交互,通过资源调度器来申请资源。
如何理解资源调度
理想情况下,应用程序提出资源请求立即得到YARN批准。但实际中,资源是有限的,并且在繁忙的集群中,应用程序通常等待资源。YARN调度程序的工作是根据一些定义的策略为应用程序分配资源。 YARN中,负责给应用程序分配资源的就是Scheduler,是RM的核心组件之一。Scheduler完全专用于调度作业,无法跟踪应用程序的状态。 调度是一个难题,没有最佳策略。为此,YARN提供了多种调度器和可配置的策略供选择。
调度策略
FIFO Scheduler(先进先出调度器) Capacity Scheduler(容量调度器) Fair Scheduler(公平调度器)
yarn.resourcemanager.scheduler.class
01
FIFO Scheduler (先进先出调度器)

FIFO Scheduler 是Hadoop1.x中JobTracker原有的调度器,此调度器在YARN中保留了下来。 FIFO Scheduler 是遵循先进先出的思想,即先提交的应用先运行。调度工作不考虑优先级和范围,适用于负载较低的小规模集群。当使用大型共享集群时,它的效率低且会导致一系列的问题。 FIFO Scheduler 拥有一个控制全局的队列queue,默认queue为default,该调度器会获取当前集群上的所有资源信息作用于这个全局的queue。
优点
无需配置,先到先得,易于执行
缺点
不考虑优先级,因此高优先级的任务需要等待
不适合大规模共享集群
02
Capacity Scheduler(容量调度器)

Capacity Scheduler 是Apache Hadoop3.x默认调度策略。该策略允许多个组织共享整个集群资源,每个组织可以获得集群的一部分计算能力。通过为每个组织分配专门的队列,然后为每个队列分配一定的集群资源,这样整个集群就可以通过设置多个队列的方式给多个组织提供服务了。
Capacity 可以理解成一个个的资源队列,这个资源队列是用户自己去分配的。队列内部又可以垂直划分,这个一个组织内部的多个成员就可以共享这个队列资源了,在一个队列内部,资源的调度采用的是先进先出(FIFO)的策略
如图所示:
将整个集群划分成两个队列 queue A 和queue B
队列A 专门负责处理大程序,队列B负责处理小程序,如果有需求可以继续划分子队列。
实际应用中可以根据不同的业务线划分不同队列,各自用自己的队列,相互不影响。
资源队列划分
Capacity Scheduler 调度器以队列为单位划分资源。简单来说,就是一个个队列有独立的资源,队列的结构和资源是可以配置的。

根据公司的业务特点,将集群按不同的业务线划分队列,划分成业务树。
首先分为default队列,生产队列,研发队列
再将生产队列,研发队列继续分别划分两个子队列
不同的程序在提交的时候,提交的各自指定的队列上,实现了共享集群资源。
优点
层次化的队列设计(Hierarchical Queues)
层次化的管理,可以更容易、更合理分配和限制资源的使用
容量保证(Capacity Guarantees)
每个队列上都可以设置一个资源占比,保证每个队列都不会占用整个集群的资源
安全(Security)
每个队列都有严格的访问控制,用户只能向自己的队列里面提交任务,而且不能修改或访问其他队列的任务
弹性分配(Elasticity)
空闲的资源可以分配给任何队列。
当多个队列出现资源争用的时候,会按照权重比例进行平衡。
03
Fair Scheduler(公平调度器)
Fair Scheduler 叫做公平调度,提供了YARN应用程序公平共享大型集群中资源的另一种方式,使所有应用在平均情况下随着时间的流逝可以获得相等的资源份额。 Fair Scheduler设计目标是为所有应用程序分配公平的资源(对公平的定义通过参数来设置) 公平调度可以在多个队列间工作,允许资源共享和抢占
单个队列

公平调度之单个队列,如上图所示,假设 job1 被分配到某个队列中,且没有其它任务运行,job1 则获得集群的全部资源。 如果此时 job2 也被分配到该队列中,则 job2 会先等待 job1 逐渐释放集群的一半资源给 job2 使用。 job2 运行完成后,但 job1 仍在运行,则 job1 又会重新占用该队列的所有资源。
多个队列

假设有两个用户 A 和 B,分别拥有一个自己的队列 Queue A 和 Queue B。 当 A 启动一个 job1 而 B 没有提交任务时,A 会获得集群的全部资源(Queue A + Queue B); 当 A 的 job1 仍在运行,且 B 启动第一个 job2 时,Queue A 会逐渐释放一半资源,两个任务会各自占用集群的一半资源; 如果此时 B 再启动第二个 job3 并且其它 job 仍在运行时,则它将会和 B 的第一个 job2 共享队列 B 的资源,也就是 Queue B 的两个 job 将会分别占用集群的四分之一资源,而 A 的 job1 仍然占用集群的一半资源;
最初,只有job1,占用了全部资源。后来由于job2加入,job1 和 job2 分别占用集群的一半资源。再后来由于 job3 的加入,job2 和 job3 平分 Queue B 的资源。最终结果就是集群的资源在两个用户之间实现了公平共享。
公平调度器的调度策略
fair: 仅根据内存公平调度资源(默认) fifo: 先进先出策略,拥有子队列的队列不能是fifo dfr: Dominant Resource Fairness(主导资源公平)策略。根据CPU或内存公平调度资源(建议)
任务 | 所需CPU | 所需内存 | 主导资源 | 占比 |
job1 | 1% | 3% | 内存 | 3% |
job2 | 9% | 3% | CPU | 9% |
因此,job1 和 job2 申请资源比例为 3% : 9%(1 :3),job2 分配的 Container 数量为 job1 的三倍。即 job1 占 1/4 数量 Container,job2 占 3/4 数量 Container。
优点
分层队列:队列可以按层次结构划分资源,并可以配置权重以按特定比例共享集群 基于用户或组的队列映射:可以根据提交任务的用户名或组来分配队列。如果任务指定了一个队列,则在该队列中提交任务。 资源抢占:根据应用的配置,抢占和分配资源可以是友好的或者是强制的。默认启用资源抢占
保证最小配额:可以设置队列最小资源,允许将最小资源分配给队列,保证用户可以启动任务。当队列不能满足最小资源时,可以从其他队列抢占。当队列资源用不完时,可以给其他队列使用。这对于确保某些用户、组或者生产应用始终获得足够的资源。 允许资源共享:当一个应用运行时,如果其他队列没有任务执行,可以使用其他队列。当其他队列有应用需要资源时再将占用的队列释放出来。所有队列都从资源队列中分配资源。




