Contents

Yarn入门

1. YARN 的产生和发展

Hadoop 1.0 中的 MapReduce 存在着一些不足。

  • 扩展性差,JobTracker 既要做资源管理,又要做任务监控,job 的最大并发数受到影响。
  • 可用性差。JobTracker 存在单点故障问题。
  • 资源利用率低。Map Slot 和 Reduce Slot 的设计无法分享,造成资源浪费。
  • 无法支持更多计算模型。只能进行 MapReduce 计算模型,无法调度流式计算,迭代计算,DAG 计算等模型。

于是在 Hadoop 2.0 中增加了 YARN 这个组件,将资源管理和作业监控分出独立的进程。

2. YARN 的组成架构

YARN 由 ResourceManager,NodeManager,ApplicationMaster 这三个组件组成。

ResourceManager 负责整个系统的资源管理和分配,负责处理客户端请求,启动/监控 ApplicationMaster,监控 NodeManage。ResourceManager 主要由调度器(Scheduler)和应用程序管理器(Applications Manager)组成。

https://chenxqblog-1258795182.cos.ap-guangzhou.myqcloud.com/obsidian/Pasted%20image%2020230814110747.png

NodeManager 驻留一个 YARN 集群中的每个节点上的代理,用于获取节点的资源,处理来自 RM 和 AM 的命令。

ApplicationMaster 应用程序管理器,负责系统中所有应用程序的管理工作。Application Master 实际上是特定计算框架的一个实例,每种计算框架都有自己独特的ApplicationMaster,负责与ResourceManager协商资源,并和NodeManager协同来执行和监控Container。MapReduce只是可以运行在YARN的一种计算框架。AM 的具体有以下几项功能:

  1. 与 Resource Manager 协商获取资源,以容器的形式为 ApplicationMaster 分配资源。
  2. 把获得的资源进一步分配给内部的各个任务(Map 任务或 Reduce 任务)
  3. 与 NodeManager 保持交互通信,进行应用程序的启动,运行,监控和停止。
  4. 向 ResourceManager 发送“心跳”消息,报告资源的使用情况和应用的进度信息。
  5. 作业完成时,ApplicationMaster 向 ResourceManager 注销容器。

2.1 基本工作流程

https://chenxqblog-1258795182.cos.ap-guangzhou.myqcloud.com/obsidian/Pasted%20image%2020230814100432.png

YARN 的基本工作流程如上图所示:

  1. 客户端提交作业job.waitForCompletion启动yarnRunner,yarnRunner向rm申请一个 Applicaiton。rm返回一个资源提交路径和application_id,客户端提交job所需要的资源(切片+配置信息+jar包)到资源提交路径。资源提交完毕,客户端申请运行 AppMaster。
  2. RM 将用户请求初始化为task,放入队列。NodeManager从队列领取任务。
  3. Node Manager 创建容器,启动 ApplicationMaster,读切片信息知道启动多少MapTask。ApplicationMaster 与 ApplicationManager 通信,汇报状态。
  4. ApplicationMaster 请求 Resource Scheduler,申请运行MapTask容器。
  5. NodeManager通过心跳领取到任务,创建容器,同时接受AppMaster发送来的启动脚本,启动MapTask。
  6. Application Master 拉取配置文件和 Jar 包,分发到 NodeManager 的 Task 上。
  7. Task 汇报运行的状态,MapTask结束后,AppMaster申请运行ReduceTask容器。
  8. Application Master 上报任务完成的状态

2.2 YARN Container

YARN Container 是逻辑上的概念,是 YARN 进行资源分配的最小单位。它和 Linux Container 没有任何关系。启动一个 YARN Container 的时候实际上是启动了一个 SHELL 进程,这个进程会拉起一个 JVM 子进程来跑具体的 Task。因此,只要加上Linux Cgroup功能,YARN Container 也能像 Linux Container 一样为任务提供一个隔离环境。

YARN 分配 Container 的过程如下: https://chenxqblog-1258795182.cos.ap-guangzhou.myqcloud.com/obsidian/Pasted%20image%2020230814104513.png

  1. ApplicationMaster 发送资源请求,资源调度器并不会马上就为它返回满足要求的资源。应用程序 AM 不断与 RM通信,探测分配到的资源。
  2. AM 可从资源调度器获取以Container表示的资源,这里的Container可以看做一个可序列化Java对象,包含的字段信息: Pasted%20image%2020230814105742.png
  3. AM 收到 Container 后,将运行在该 Container 的任务所需的运行环境信息(包含运行命令、环境变量、依赖的外部文件等)连同Container中的资源信息封装到StartContainerRequests对象中,发送给NodeManager,以启动该任务。

3. 资源调度器

3.1 资源调度算法

在讲 YARN 的资源调度器钱,我们先了解几种通用的资源调度算法。调度算法是整个资源管理系统中的一个重要组成部分,简单地说,调度算法的作用是决定一个计算任务需要放在集群中的哪台机器上面。

https://chenxqblog-1258795182.cos.ap-guangzhou.myqcloud.com/obsidian/Pasted%20image%2020230814111502.png

1. FIFO 调度

基本思路:先来的先被调用,先分配CPU、内存等资源,后来的在队列等待。
优点:这种方式适合平均计算时间、耗用资源情况差不多的作业,为了让后来的作业有机会提前运行,通常还会匹配优先级,即优先级高的先运行,优先级一样的按先来后到方式运行。 缺点:但是实际操作的时候,优先级容易碰到问题,如果用户都认为自己的作业优先,把自己提交的作业优先级都设置的最高,这样排在后面的作业还是要等很久才被调度,特别是前面有一个耗用资源特别久的作业,比如占用几个小时乃至几天的大部分机器的CPU和内存的训练算法作业,导致排在后面的大量很短时间运行完、耗用资源比较少的作业很久才被调度,实际上他们优先调度更适合。

2.SJF调度(短任务优先:Shortest Job First,SJF)

为了改进FIFO算法,减少平均周转时间,人们提出了短作业优先算法。
基本思路:各个任务在开始执行之前,必须事先预计好它的执行时间,然后调度器将根据这些时间,从中选择用时较短的任务优先执行。
优点:这种方式已经解决FIFO算法的缺点,不会让短任务因为前面出现的大任务而堆积。
缺点: 但是这样也是有问题的,如果一个用户一次提交了大量作业,就为了优先得到执行,如果他提交的作业时间都比较短,那永远都是这个用户在占用计算平台集群资源,其他用户永远在等。

3.时间片轮转调度

时间片轮转算法(Round Robin,RR)
基本思路是:把系统当中的所有就绪任务按照先来先服务的原则,排成一个队列,然后再每次调度的时候,把处理器分派给队列当中的第一个任务,让它去执行一小段CPU时间(即时间片,timeslice)。当这个时间片结束时,如果任务还没有执行完成的话,将会发生时钟中断,在时钟中断里面,调度器将会暂停当前任务的执行,并把它送到就绪队列的末尾,然后执行当前的队首任务。
反之,如果一个任务在它的时间片用完之前就已经结束了或者阻塞了,那么它就会立即让出CPU给其他任务。
优点: 跟任务的大小无关,大家获得公平的资源分配。
缺点:该算法要求计算框架支持中断。此外,时间片的大小要适当选取,如果选择不当,将会影响到系统的性能和效率。 如果时间片太大,每个任务都在一个时间片内完成,这就退化为先来先服务算法了,如果太小, 任务之间的切换次数增加,从而增大了系统的管理开销,降低了CPU的使用效率

4. 最大最小公平调度

最大最小公平调度(Min-Max Fair)
基本思路: 将资源平分成n份,每份都是S/n,把每份分给相应的用户,如果超过了用户的需求,就回收超过的部分, 然后把总体回收的资源,平均分给上一轮分配中尚未得到满足的用户,依次类 推,直到没有回收的资源为止。

加权最大最小公平调度(Weighted Min-Max Fair)
基本思路: 令W=w1 + w2+ … + wn, 将资源按照权重分成n份,每份分别是:S*w1/W, S*w2/W,…, S*wn/W。把每份分给相应的用户。 如果超过了用户的需求,就回收超过的部分,假设有m个用户尚未得到满足。然后把总体回收的资源,按照目前尚未满足的用户的权重分成m份,给对应的用户。依次类推,直到没有回收的资源为止。
优点:考虑到了公平性,无论是大任务还是小任务,都能相对公平的得到服务。
缺点:加权的设置对平台有着更高的要求,加权不合理可能会破坏公平性。

5.容量调度

容量调度(Capacity)
基本思路: 首先划分多个队列, 队列资源采用容量占比的方式进行分配 。 每个队列设置资源最低保证和资源使用上限。 如果队列中的资源有剩余或者空闲,可以暂时共享给那些需要资源的队列,而一旦该队列有新的应用程序需要资源运行,则其他队列释放的资源会归还给该队列。
优点:资源可以得到最大化的利用
缺点:但是小任务仍然会等待较多的时间。而且无法自定义优先级。

3.2 YARN的三种调度器

ResourceManager作为YARN的核心组件,调度器就位于其中。

3.2.1 FIFO 调度器

按照先进先出的规则,同一个时间队列中只有一个任务在执行。FIFO 调度器以集群资源独占的方式来运行作业,这样的好处是可以充分利用所有的集群资源。

https://chenxqblog-1258795182.cos.ap-guangzhou.myqcloud.com/obsidian/Pasted%20image%2020230814112756.png

如图所示,有一个很大的Job1先提交,并且占用了全部的资源。那么job2提交时发现没有资源了,则job2必须等待job1执行结束,才能获得资源执行。

3.2.2 容量调度器

容量调度器有多个队列,队列支持树形嵌套。每个队列内部可以使用FIFO先进先出,同一时间队列只有一个任务在执行。队列的并行度为队列的个数。

https://chenxqblog-1258795182.cos.ap-guangzhou.myqcloud.com/obsidian/Pasted%20image%2020230814113117.png

如图所示,我们可以为每个队列分配一个资源占比,队列A 60%,队列B 40%。队列A 又可以分为 A1 (40%) 和 A2 (60%),子队列中的占比是指占父队列的资源比例,即A1占A队列的40%,占根(root)队列的24%。通过配置maximum-capacity 可以配置队列资源使用上限百分比,这样在其他队列空闲的情况下,空闲的资源可以分配给需要的队列。通过配置 user-limit-fator 配置每个用户最多可使用的资源百分比。

https://chenxqblog-1258795182.cos.ap-guangzhou.myqcloud.com/obsidian/Pasted%20image%2020230814143837.png

如图所示,有一个大的job1提交到queueA,并占用了全部资源,queue B 中此没有任务,也会被借用。此时再提交一个小job2到queueB,因为queueA和queueB资源相互独立,job2可以使用抢占规则,把job1的占用的任务kill掉,立即执行自己的任务,也可以等job1慢慢执行完,job2再开始占用,之后的job1无法再调度资源到 queue B。

3.2.3 公平调度器

公平调度器与容量调度一样,都有层次化队列的设计,每个队列内部的作业按缺额(在资源有限的情况下,每个job理想情况下获得的资源与实际获得的资源存在一个差距,这个差距就是缺额)分配资源,同一时间队列中有多个任务执行。队列的并行度等于队列的个数。

公平调度的好处是可以让段的作业在合理的时间内完成,而不必一直等待长作业的完成,并且作业可以设置优先级。

https://chenxqblog-1258795182.cos.ap-guangzhou.myqcloud.com/obsidian/Pasted%20image%2020230814144353.png

如图所示,先提交到队列A的job1占用了整个集群的资源,此时job2提交到队列B。原先被job2占用的队列B的资源释放,稍微延迟一会儿后,job1和job2同时运行,各占一半。此时在队列B再提交一个job3,job2和job3将同时运行,各占四份之一。

容量调度器与公平调度器的区别:

相同:

  1. 以队列划分资源
  2. 设定最低保证和最大使用上限。
  3. 在某个队列空闲时可以将资源共享给其他队列。

不同:

  1. 公平调度器队列内支持多种调度策略,包括FIFO, Fair(队列中的N个作业,每个获得该队列1/N的资源)、DRF(多种资源类型,e.g. CPU,内存的公平资源分配策略)
  2. 公平调度器可以使得小应用快速获得资源,避免了饿死的情况。
  3. 容量调度支持更多的功能,如带label的调度,对不同资源的机器做分区。
  4. 容量调度在生产中能支持更多的任务,性能比公平调度器好。