前言:
而今大家对“容量调度算法”大约比较看重,我们都想要知道一些“容量调度算法”的相关内容。那么小编同时在网络上网罗了一些有关“容量调度算法””的相关资讯,希望我们能喜欢,咱们一起来了解一下吧!
然后我们再来看公平调度器,公平调度器是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策略,针对不同的应用进行不同的资源分配的比例限制了.
标签: #容量调度算法