一、SRC
yarn的调度器、角色组、资源池
资源是有限的,所以需要分配资源,我们希望可以为提交到yarn的每个任务设置具体的资源,Hadoop中提供的调度器Scheduler就可以满足这种需求。所以就需要策略,不同的调度器实际上就是不同的策略。
调度器根据容量、队列等限制条件(如每个队列分配一定的资源,最多执行一定数量的作业等),将系统中的资源分配给各个提交到yarn的应用程序。调度器仅根据各个应用程序的资源需求进行资源分配,而资源分配单位是Container。Scheduler不负责监控或者跟踪应用程序的状态,也不负责任务因为各种原因而需要的重启(由ApplicationMaster负责)。总之,调度器根据应用程序的资源要求,以及集群机器的资源情况,为用程序分配封装在Container中的资源。调度器是可插拔的,例如CapacityScheduler、FairScheduler。(PS:在实际应用中,只需要简单配置即可)
二、COM
1. 调度器
{1} FIFO Scheduler(先进先出调度器)
FIFO Scheduler把应用按提交的顺序排成一个队列,这是一个先进先出队列,在进行资源分配的时候,先给队列中最头上的应用进行分配资源,待最头上的应用需求满足后再给下一个分配,以此类推。
FIFO Scheduler是最简单也是最容易理解的调度器,也不需要任何配置,但它并不适用于共享集群。大的应用可能会占用大量资源,导致剩下的资源不足以支撑后面的job,这就导致其它应用被阻塞。
在共享集群中,更适合采用Capacity Scheduler或Fair Scheduler,这两个调度器都允许大任务和小任务在提交时获取指定的资源而不是全部,便于app的并行执行。
{2} Capacity Scheduler(容量调度器) (默认)
hadoop2.x默认的调度器。
相当于多个FIFO,一个FIFO叫一个队列queue,可以分别给queue指定资源上限
特点:
[1] 支持多个队列,每个queue可配置资源上限,每个queue采用FIFO调度策略。
可以防止
[2] 默认以用户的组.
用户名作为queue的名字,为了防止一个用户独占队列中资源,CS会对同一用户提交的app所占资源量进行限定,
计算1个queue中正在运行的任务占用的资源和该queue的资源上限的比值,选择该比值最小的队列,也就是最闲的队列。
然后按照作业优先级 + 提交时间 + 用户资源限制 + 硬件限制 对queue内的任务排序。
{3} Fair Scheduler(公平调度器)
按缺额排序
[1]
公平的理解:
不论什么任务,都可以获取资源,一般不会出现等待accepted的状态。
在上面的“Yarn调度器对比图”展示了一个队列中两个应用的公平调度;当然,公平调度在也可以在多个队列间工作。举个例子,假设有两个用户A和B,他们分别拥有一个队列。当A启动一个job而B没有任务时,A会获得全部集群资源;当B启动一个job后,A的job会继续运行,不过一会儿之后两个任务会各自获得一半的集群资源。如果此时B再启动第二个job并且其它job还在运行,则它将会和B的第一个job共享B这个队列的资源,也就是B的两个job会用于四分之一的集群资源,而A的job仍然用于集群一半的资源,结果就是资源最终在两个用户之间平等的共享。在Fair调度器中,我们不需要预先占用一定的系统资源,Fair调度器会为所有运行的job动态的调整系统资源。当第一个大job提交时,只有这一个job在运行,此时它获得了所有集群资源;当第二个小任务提交后,Fair调度器会分配一半资源给这个小任务,让这两个任务公平的共享集群资源。
a) 公平调度器,就是能够共享整个集群的资源
b) 不用预先占用资源,每一个作业都是共享的
c) 每当提交一个作业的时候,就会占用整个资源。如果再提交一个作业,那么第一个作业就会分给第二个作业一部分资源,第一个作业也就释放一部分资源。再提交其他的作业时,也同理。。。。也就是说每一个作业进来,都有机会获取资源。
[2]
将整个Yarn的可用资源划分成多个资源池,每个资源池中可以配置最小和最大的可用资源(内存和CPU)、最大可同时运行Application数量、权重、以及可以提交和管理Application的用户等。
[3] weight(权重)- 根据权重获得额外的空闲资源
在每个资源池的配置项中,有个weight属性(默认为1),标记了资源池的权重,当资源池中有任务等待,并且集群中有空闲资源时候,每个资源池可以根据权重获得不同比例的集群空闲资源。
比如,资源池businessA和businessB的权重分别为2和1,这两个资源池中的资源都已经跑满了,并且还有任务在排队,此时集群中有30个Container的空闲资源,那么,businessA将会额外获得20个Container的资源,businessB会额外获得10个Container的资源。
[4] 最小资源
在每个资源池中,允许配置该资源池的最小资源,准确说是保底资源、预留资源,就是无论别的yarn资源多紧张,即使这个资源池没执行任务,也会占用这些最小资源。
比如,资源池businessA中配置了最小资源为(5vCPU,5GB),那么即使没有任务运行,Yarn也会为资源池businessA预留出最小资源,一旦有任务需要运行,而集群中已经没有其他空闲资源的时候,这个最小资源也可以保证资源池businessA中的任务可以先运行起来,随后再从集群中获取资源。
[3] usage
先在yarn中设置每个资源池的上下限,设置包含的用户名。比如,在资源池businessA中配置了允许用户businessA和用户temp提交任务,如果使用用户temp提交任务,并且在任务中指定了资源池为businessA,那么也可以使用businessA中的资源。
(1) example
如图所示,假设整个Yarn集群的可用资源为100vCPU,100GB内存,现在为3个业务各自规划一个资源池,另外,规划一个default资源池,用于运行其他用户和业务提交的任务。如果没有在任务中指定资源池(通过参数mapreduce.job.queuename),那么可以配置使用用户名作为资源池名称来提交任务,即用户businessA提交的任务被分配到资源池businessA中,用户businessC提交的任务被分配到资源池businessC中。其他用户提交的任务将会被分配到资源池default中。
这里的用户名,就是提交Application所使用的Linux/Unix用户名,如果配置了kerberos,则就是krb认证的用户。
2. 角色组
yarn中独有的抽象,组内的角色(其实就是nm)可以单独设置资源上下限,配合调度器使用。可以修改角色的组,也可以对组进行CRUD