龙空技术网

大数据之-Hadoop3.x_Yarn_容量调度器

程序猿小鹿 79

前言:

而今大家对“容量调度算法”大约比较看重,我们都想要知道一些“容量调度算法”的相关内容。那么小编同时在网络上网罗了一些有关“容量调度算法””的相关资讯,希望我们能喜欢,咱们一起来了解一下吧!

然后我们再来看公平调度器,公平调度器是facebook开发的一个调度器,

上面的容量调度器是雅虎开发的对吧.

然后我们看看公平调度器的特点,可以看到,它要做到的就是公平,他也可以有多个队列,但是同一个队列中的所有任务

会共享资源,会在时间尺度上,获取公平的资源,什么意思呢?

可以看到queuea,占用百分之20的资源,那么如果有4个任务,每个任务就会占用百分之5的资源,是这样公平分配的

可以看到每个队列,占用的资源都是绝对公平的对吧.这个就是公平调度器

可以看到公平调度器,也是支持多格队列

2.管理员可以为每个队列设置最低资源保证,比如某个队列设置最低都要有百分之5的资源,然后最多

只能用百分之20的资源.

3.并且跟容量调度器一样,如果一个队列中的资源有剩余,那么可以把资源占时共享给,其他需要资源的队列,而改队列

有了任务提出需要资源的时候,其他借出去的资源会再次归还给该队列

4.并且也支持多租户,可以看到在queuec中,ss可以用,cls也可以用这个队列,这两个用户都可以使用.

再看容量调度器在优先给予资源的时候,是看哪个队列中的任务比较小,占用的资源比较小就优先把

资源给这个队列

但是公平调度器不这样,他是看哪个队列中的资源缺额比例大,就是说,看哪个队列,运行任务的时候

资源不够了,并且差的越多,就优先把资源给他.

然后再去看,每个队列都可以单独设置资源的分配方式,我们之前说

容量调度器是,任务先来先给分配资源是FIFO的方式,但他同时也支持

DRF,就是说,内存和cpu资源的分配方式,这个后面我们会再说.

然后公平调度器的话,同时支持FIFO的资源分配方式,FAIR公平方式,以及DRF方式去,

分配内存和cpu资源.FAIR 和DRF后面我们会说,这两种方式针对,前来需要资源的任务,是怎么样

为他们分配cpu和内存资源的.

然后我们首先去看看什么是缺额,就是任务来了以后,资源不够了,不够的部分是多少资源,这个就是

缺额.

可以看到,这个公平调度器是在时间尺度上的,什么意思呢?

比如上面我们有4个job,当前是平均分配的资源,那么这个时候,突然来了job15,这个任务,那么他来了

也不可能立即能给他分配资源对吧,如果把job15放到最后的话,那么当前马上能给job15提供资源的

只有先从job14拿出一点资源来给他用,但是这点资源不够,那么就得给系统一定的时间,然后

系统会从job11,job12,job13上面再拿出一点资源来,给job15使用,最终形成新的平均分配规则.

而,当只有job14拿出一点资源来,但是还不够,还差job11,job12,job13,给的那部分资源的时候

那部分资源就叫做缺额.job15的缺额.

可以看到公平调度器,会为缺额比较大的作业有限配置资源.

然后公平调度器的,每个队列中给任务分配资源的策略如果选择FIFO的话,那么就是先进先出,跟之前的一样.

容量调度器中的队列,在给任务分配资源的时候就用的FIFO的策略对吧.

然后我们再看fair公平策略,我们知道公平策略就是给每个任务,平均分配资源.如果有3个任务,那么每个占用

3分之一,那么具体他是怎么分配的呢,他这里使用了叫做最大最小公平算法实现的资源多路复用

然后再看,这个fair策略也是,跟容量调度器一样,先按照队列分配,再按照作业级别分配,然后再按照容器

分配资源.

要知道这个算法,首先看,什么是实际最小资源份额,那么

上面可以看到一个资源需求量如果是4,而我们配置的最小资源是2,那么,就是说

实际最小资源就是Min(资源需求4,配置最小资源2) 取两个中小的,也就是2.

然后再去判断是否饥饿,判断是否饥饿,就是判断,资源使用量,和上面实际最小资源份额比较,比如现在

资源被使用了1,然后实际最小资源份额是2,那么这个时候,资源使用量小于实际最小资源份额了,

就是饥饿的.

那么再去看资源分配比例,资源分配比 = 资源使用量上面是1 除以 Max(实际最小资源份额,1) 和1 去对比

取大的值就是2,那么 1 / 2 = 就是百分之50,就是说资源被分配了百分之50了,还需要分配百分之50

那么如果资源使用量是0.3的话,那么0.3 / 2 = 百分之15,那么也就说,他的资源分配比,才分配了百分之15

还需要百分之85才行,那么就优先分配需要资源多的.,这里就看出来了,就是看谁缺的多就优先

给谁分配对吧,按照缺额来分配.

然后出了按照上面的计算,看谁的资源分配比低,越低的,就是已经分配到的资源越少,

那么就越优先分配,还有就是.

看资源使用的权重比,比如有个任务对资源使用权重是8,有个任务对资源使用权重是

2,那么就分配资源的时候,给权重是8的分配的会更多一些.后面还会说.

然后再来过一遍,右边的图可以看到,首先计算上面那4个值,然后判断是否饥饿,

可以看到如果资源是用来是1,而实际最小资源份额是2,就说至少需要2个资源,这个任务才能运行

那么,资源使用量1 < 小于 实际最小资源份额 这个时候就是饥饿的. 如果饥饿的话,就先给

饥饿的去分配资源.

那么如果所有任务都饥饿呢? 再去看资源分配比,资源分配比也就是已经分配的资源,

已经分配的资源小的,越小就说明越需要资源,就优先分配给这样的任务.

如果所有的任务,都饥饿,并且所有的任务资源分配比还都一样,那么这个时候,再去看任务的提交时间按照任务提交时间去分配资源,哪个任务提交上来早,就优先给他分配资源.

如果所有任务都不饥饿的情况,那么再去看

资源使用权重比,那么就是去看资源使用权重比小的, 资源使用权重比,就是衡量资源

使用的多少,越小说明,已经使用的资源就越少,还需要的资源就越多,这个时候就,优先

分配给资源使用权重比小的.

如果资源使用权重比都一样的话,那么再去按照任务的提交时间顺序去执行.

然后我们去看一个案例,可以看到我们有queuea,queueb,queuec 3个队列,那么queuea,占用百分之20,ququeb占用百分之50,queuec占用百分之30的资源,并且queuec下面ss用户占用了queuec资源的百分之50,queuec下面cls用户占用了queuec资源的百分之50.

这个时候按照第一次分配,公平调度策略,100 /3 ,那么queuea,queueb,queuec,分别

被分到33.33资源,那么分完以后,因为我们说,queuea占用20的资源,但是他现在得到了33.33对吧

,多了13.33的资源,然后queueb需要50的资源他现在得到了33.33的资源还需要16.67,queuec

占用30的资源,但是他得到了33.33 活了3.33对吧.

那么第二次计算,就会把queuea多出来的13.33的资源和 queuec多出来的3.33的资源,

也就是16.66的资源,分配给queueb,那么queueb的资源就是33.33 + (16.66) = 50 对吧,这样

就达到了queuea占用20,queueb占用50,queuec占用30对吧.

上面就是队列资源分配的规则.可以看到使用了公平调度规则

然后再去看作业资源分配的规则,先看不加权的,首先比如我们有一共12个资源,有4个job,

job1需要1个资源,job2需要2个资源,job3需要6个资源,job4需要5个资源,那么一共需要

14个资源,但是我们只有12个资源,那么按照公平调度规则怎么分?

这样,首先第一次计算:

按照公平调度规则,4个任务分别会得到12 / 4= 3个资源

那么job1得到3个资源,但是他需要1个资源,多出两个资源

job2得到3个资源,但是他需要2个资源多出1个资源

job3需要6个资源但是他得到3个资源,缺3个资源

job4需要5个资源但是他得到3个资源,缺2个资源.

那么第二次计算,拿出多余的资源也就是job1多出的3个资源,job2多出的1个资源

拿出多出的3个资源.

现在job1,已经够了需要一个资源,job2,也已经够了需要2个资源,也就是只有

job3,job4还缺资源,那么就用多出的3 /2 = 1.5,就说 job3,job4可以各拿1.5个资源

那么现在job3原来有3个资源 + 1.5 = 4.5个资源但是还缺1.5个资源,

job4原来有3个资源,现在+1.5 = 4.5个资源还缺 0.5个资源对吧.

这样就已经没有剩余的资源了对吧,现在所有的资源都被分配了那么现在资源就分配完了.

如果有资源了他还会这样继续分下去.

然后再去看看,加权怎么去分:

首先我们有总资源16个,然后有4个job,那么4个job对资源分别有,job1需要4个资源,

job2需要2个资源,job3需要10个资源,job4需要4个资源.一共需要20个资源,但是我们只有

16个资源对吧,一会看一下怎么分.

并且每个job的权重是job1 5个权重,job2 是8个权重,job3是一个权重,job4是2个权重.

那么这个时候.一共的权重就是5+8+1+2=16对吧

这是基本信息,然后我们开始去分配资源.

首先第一次计算 用我们有的总资源16 / 权重的和 5+8+1+2 = 16

结果是16 /16 =1对吧,然后,用这1 去分别乘以权重,比如job1权重是5,那么

job1就 1 * 5 = 5 分5个资源,而job1需要4个资源所以多出来1个资源

job2就 8 * 1 分8个资源,而job2需要2个资源,就多出来6个资源

job3就 1*1 分1个资源,而job3需要10个资源,就少了9个资源

job4就 2* 1 分2个资源,而job4需要4个资源就少了2个资源

那么这个时候再去进行第二次计算,

这一次,我们再去用job1多出来的资源1,和job2多出来的资源6,一共多出来7个资源

去除以需要缺少资源的job3,job4的比重,也就是1,2 也就是

7 / (1+2 ) = 7/3 = 2.33对吧

计算好了以后再去分配资源

首先给缺少资源的job3 分配资源 ,给job3分配 job3的权重1 * 7/3 = 2.33个资源,那么

这个时候job3一共需要10个资源,现在分配了2.33个资源,加上上一次分配的1个资源,

那么就是还需要 10 -1 - 2.33 = 6.67 还需要6.67个资源

那么job4 现在 给分配 (7/3) * 权重2 = 4.66个资源,那么,加上上一次分配的2个资源,就是

一共获得了 2+ 4.66 = 6.66个资源,但是job4只需要4个资源,那么就是多出了2.66个资源.

对吧.

可以看到根据上面的说明,经过第二次计算,job3,还差6.67个资源,然后

job4多出了2.66个资源.

然后再进行第3个计算,job4多出的2.66个资源,会分配给缺少资源的

job3,而job3的权重是1 ,那么就用2.66 / 1 = 2.66

然后这次给job3分配 2.66 * 1 个资源,也就是2.66个资源.

job3就一共获取了 2.66 + 第二次计算分配的资源 2.33 + 第一次计算分配的资源 1 = 5.99个资源

然后 这个时候,只有job3 缺少资源了,job1,job2,job4 都不缺资源了.

而job3需要10个资源那么,现在job3还需要 10 - 5.99 = 4.01 还差4.01个资源.

但是已经没有资源可以分配了,那么现在就等待出现资源以后再按照上面那样去分配.

然后我们再来看一下什么是DRF策略,可以看到我们上面说的,资源都是单一的,指的是内存资源,

但是实际情况资源除了内存,还有cpu,网络带宽等等,这些全都算起来以后,我们就很难去衡量

两个应用应该怎么去分配资源比例.

这个时候怎么办在yarn中就可以使用DRF策略来调度,比如我们一个集群有100个CPU,10T的内存,那么这个时候比如应用A需要2个CPU,300GB的内存,应用B需要6个CPU,100GB内存,那么这两个应用,应用A需要百分之2的cpu和百分之3的内存, 应用B需要百分之6的cpu和百分之1的内存.

那么,就说明应用A是内存主导的,应用B是cpu主导的,那么针对这样的情况就需要使用DRF策略,针对不同的应用进行不同的资源分配的比例限制了.

标签: #容量调度算法