Yarn资源调度策略

2021-01-05 11:50:19 浏览数 (1)

资源调度策略

Yarn既然是一个分布式资源调度框架,管理着节点上的计算资源,那它分配这些资源的时候,便会存在调度策略。

而Yarn的调度策略有三种:FIFO调度、容量调度、公平调度。接下来,会依次对这几种调度器进行讲解。

FIFO调度器

FIFO Scheduler(先进先出调度器),这种调度器其实已经耳熟能详了,它将所有任务放入一个队列,先进队列的先获得资源,排在后面的任务只有等待,总的原则就是先到先得。

虽然这种调度策略,实现起来非常简单;但它因为只有单个队列,无法交叉运行任务、灵活性差,紧急任务无法插队,耗时长的任务拖慢耗时短的任务,对紧急任务、小任务不友好。

FIFO调度策略不需要配置,Yarn默认使用的就是这种策略。

容量调度器

Capacity Scheduler(容量调度器)的核心思想是:提前做预算,在预算指导下分享集群资源。Yarn默认的调度策略。

既然FIFO单队列对紧急、耗时短的任务不友好,使得这些任务无法立即执行,那么就划分多个队列,用于提交不同的任务,并对这些队列提前预分配资源,可以按照百分比来分配,也可以按照容量来分配。

现在,假设划分两个队列A和B,队列A用于提交大任务,因为大任务消耗资源多,所以为它预先分配集群80%的资源;对于小任务和紧急任务,可以提交到队列B中,这些任务一般占用资源较少,所以分配20%的资源。

这样一来,小任务和紧急任务得到了保障,这是容量调度的第一个要点:预分队列、预先分配资源。当然每个队列中使用的依然是FIFO调度

但假设很长一段时间,都没有大任务提交到A队列中,B队列却很繁忙,A队列占用的80%的资源一直处于空闲状态,造成了集群资源的浪费。

那能够让B队列使用空闲的资源吗?是可以的。可以动态调整队列容量,设置队列最大资源占用,现在的配置情况是A为80%,B为20%,但可以配置队列B最大可以占用集群90%的资源,于是队列B在集群空闲的时候,就可以拿到90%的运算资源,减少集群资源浪费。

当然也可以设置为100%,但这样的话,如果队列A此时提交任务,容量调度支持抢占,需要队列B释放资源,这部分的调度过程是有开销的。

如果存在多个队列,集群出现的空闲资源如何分配?会弹性分配,优先分配给“实际资源/预算资源”比值最低的队列。

而且容量调度可以嵌套子队列,作业分配时更加灵活。队列A提交大任务,队列B提交紧急任务和小任务,队列B又可以划分队列C、D,队列C专门用于紧急任务,队列D用于小任务。

容量调度方式在企业中比较常用,它预分队列的方式可以为不同部门、不同运算任务限定不同的资源,而且因为其动态和弹性的特征,有效解决了很多的问题。

公平调度器

Fair Scheduler(公平调度器),也是进行多队列的划分,但它不同于容量调度的是,公平调度不会为每个队列预先分配资源。那这些队列之间如何使用集群资源呢?多队列公平共享集群资源。

何为公平?公平当然是指,见面分一半。

现在有队列A和队列B,它们不预分配队列资源,于是队列A在开始的时候将任务1提交到集群中,此时发现集群并没有任务在运行,于是就占用了集群的全部资源。但过了一段时间,队列B中提交了任务2,发现集群没有资源了,于是队列B可以抢占资源,抢占多少呢?公平起见,当然是见面分一半,给队列A一点调度时间,将一半资源分配给队列B,于是队列B中开始运行任务2。

公平调度,允许队列之间抢占,当然队列内部也可配置调度策略为FIFO或者Fair(默认)。按照默认情况,队列B中任务2执行了一段时间之后,任务3被提交上来了,怎么办?见面分一半,给任务2一点时间进行调度,将一半资源分配给任务3运行。

队列内部的这种分一半的策略不是无限进行的,每个队列会设置队列内同时运行的最大任务数来避免这种拆分方式导致任务获得的资源不足的情况。

当然这不是绝对的公平,因为见面分一半是好的,但有一些队列因为提交的任务特殊,所以需要更多的资源。此时可以调节队列权重,当集群存在空闲资源的时候,按照权重来分配资源,队列在默认情况下,初始权重均为1。

在企业中具体选择Yarn的哪种策略,就要根据具体情况来对待了。

结束语

如果有帮助的,记得点赞、关注。在公众号《数舟》中,可以免费获取专栏《数据仓库》配套的视频课程、大数据集群自动安装脚本,并获取进群交流的途径。

我所有的大数据技术内容也会优先发布到公众号中。如果对某些大数据技术有兴趣,但没有充足的时间,在群里提出,我为大家安排分享。

0 人点赞