Hadoop Yarn调度器的选择和使用

1、引言

Yarn在Hadoop的生态系统中担任了资源管理和任务调度的角色。在讨论其构造器以前先简单了解一下Yarn的架构。node

上图是Yarn的基本架构,其中ResourceManager是整个架构的核心组件,它负责整个集群中包括内存、CPU等资源的管理;ApplicationMaster负责应用程序在整个生命周期的任务调度;NodeManager负责本节点上资源的供给和隔离;Container能够抽象的当作是运行任务的一个容器。本文讨论的调度器是在ResourceManager组建中进行调度的,接下来就一块儿研究一下包括FIFO调度器、Capacity调度器、Fair调度器在内的三个调度器。安全

2、FIFO调度器

上图为FIFO调度器的执行过程示意图。FIFO调度器也就是平时所说的先进先出(First In First Out)调度器。FIFO调度器是Hadoop最先应用的一种调度策略,能够简单的将其理解为一个Java队列,它的含义在于集群中同时只能有一个做业在运行。将全部的Application按照提交时候的顺序来执行,只有当上一个Job执行完成以后后面的Job才会按照队列的顺序依次被执行。FIFO调度器以集群资源独占的方式来运行做业,这样的好处是一个做业能够充分利用全部的集群资源,可是对于运行时间短,重要性高或者交互式查询类的MR做业就要等待排在序列前的做业完成才能被执行,这也就致使了若是有一个很是大的Job在运行,那么后面的做业将会被阻塞。所以,虽然单一的FIFO调度实现简单,可是对于不少实际的场景并不能知足要求。这也就催发了Capacity调度器和Fair调度器的出现。架构

3、Capacity调度器

上图是Capacity调度器的执行过程示意图。Capacity调度器也就是平常说的容器调度器。能够将它理解成一个个的资源队列。这个资源队列是用户本身去分配的。例如由于工做所须要把整个集群分红了AB两个队列,A队列下面还能够继续分,好比将A队列再分为1和2两个子队列。那么队列的分配就能够参考下面的树形结构: —A[60%] |—A.1[40%] |—A.2[60%] —B[40%] 上述的树形结构能够理解为A队列占用整个资源的60%,B队列占用整个资源的40%。A队列里面又分了两个子队列,A.1占据40%,A.2占据60%,也就是说此时A.1和A.2分别占用A队列的40%和60%的资源。虽然此时已经具体分配了集群的资源,可是并非说A提交了任务以后只能使用它被分配到的60%的资源,而B队列的40%的资源就处于空闲。只要是其它队列中的资源处于空闲状态,那么有任务提交的队列可使用空闲队列所分配到的资源,使用的多少是依据配来决定。参数的配置会在后文中提到。app

在这里仍是要推荐下我本身建的大数据学习交流群:784557197,群里都是学大数据开发的,若是你正在学习大数据 ,小编欢迎你加入,你们都是软件开发党,不按期分享干货(只有大数据软件开发相关的),包括我本身整理的一份2018最新的大数据进阶资料和高级开发教程,欢迎进阶中和进想深刻大数据的小伙伴加入。oop

Capacity调度器具备如下的几个特性:

  • 层次化的队列设计,这种层次化的队列设计保证了子队列可使用父队列设置的所有资源。这样经过层次化的管理,更容易合理分配和限制资源的使用。
  • 容量保证,队列上都会设置一个资源的占比,这样能够保证每一个队列都不会占用整个集群的资源。
  • 安全,每一个队列又严格的访问控制。用户只能向本身的队列里面提交任务,并且不能修改或者访问其余队列的任务。
  • 弹性分配,空闲的资源能够被分配给任何队列。当多个队列出现争用的时候,则会按照比例进行平衡。
  • 多租户租用,经过队列的容量限制,多个用户就能够共享同一个集群,同事保证每一个队列分配到本身的容量,提升利用率。
  • 操做性,Yarn支持动态修改调整容量、权限等的分配,能够在运行时直接修改。还提供给管理员界面,来显示当前的队列情况。管理员能够在运行时,添加一个队列;可是不能删除一个队列。管理员还能够在运行时暂停某个队列,这样能够保证当前的队列在执行过程当中,集群不会接收其余的任务。若是一个队列被设置成了stopped,那么就不能向他或者子队列上提交任务了。
  • 基于资源的调度,协调不一样资源需求的应用程序,好比内存、CPU、磁盘等等。

相关参数的配置:

(1)capacity:队列的资源容量(百分比)。 当系统很是繁忙时,应保证每一个队列的容量获得知足,而若是每一个队列应用程序较少,可将剩余资源共享给其余队列。注意,全部队列的容量之和应小于100。 (2)maximum-capacity:队列的资源使用上限(百分比)。因为存在资源共享,所以一个队列使用的资源量可能超过其容量,而最多使用资源量可经过该参数限制。(这也是前文提到的关于有任务运行的队列能够占用的资源的最大百分比) (3)user-limit-factor:每一个用户最多可以使用的资源量(百分比)。好比,假设该值为30,则任什么时候刻,每一个用户使用的资源量不能超过该队列容量的30%。 (4)maximum-applications :集群或者队列中同时处于等待和运行状态的应用程序数目上限,这是一个强限制,一旦集群中应用程序数目超过该上限,后续提交的应用程序将被拒绝,默认值为 10000。全部队列的数目上限可经过参数yarn.scheduler.capacity.maximum-applications设置(可看作默认值),而单个队列可经过参数yarn.scheduler.capacity..maximum- applications设置适合本身的值。 (5)maximum-am-resource-percent:集群中用于运行应用程序 ApplicationMaster的资源比例上限,该参数一般用于限制处于活动状态的应用程序数目。该参数类型为浮点型,默认是0.1,表示10%。全部队列的ApplicationMaster资源比例上限可经过参数yarn.scheduler.capacity. maximum-am-resource-percent设置(可看作默认值),而单个队列可经过参数 yarn.scheduler.capacity.. maximum-am-resource-percent设置适合本身的值。 (6)state :队列状态能够为STOPPED或者 RUNNING,若是一个队列处于STOPPED状态,用户不能够将应用程序提交到该队列或者它的子队列中,相似的,若是ROOT队列处于STOPPED 状态,用户不能够向集群中提交应用程序,但正在运行的应用程序仍能够正常运行结束,以便队列能够优雅地退出。 (7)acl_submit_applications:限定哪些Linux用户/用户组可向给定队列中提交应用程序。须要注意的是,该属性具备继承性,即若是一个用户能够向某个队列中提交应用程序,则它能够向它的全部子队列中提交应用程序。配置该属性时,用户之间或用户组之间用“,”分割,用户和用户组之间用空格分割,好比“user1, user2 group1,group2”。 (8)acl_administer_queue:为队列指定一个管理员,该管理员可控制该队列的全部应用程序,好比杀死任意一个应用程序等。一样,该属性具备继承性,若是一个用户能够向某个队列中提交应用程序,则它能够向它的全部子队列中提交应用程序。学习

4、Fair调度器

上图是Fair调度器在一个队列中的执行过程示意图。Fair调度器也就是平常说的公平调度器。Fair调度器是一个队列资源分配方式,在整个时间线上,全部的Job平均的获取资源。默认状况下,Fair调度器只是对内存资源作公平的调度和分配。当集群中只有一个任务在运行时,那么此任务会占用整个集群的资源。当其余的任务提交后,那些释放的资源将会被分配给新的Job,因此每一个任务最终都能获取几乎同样多的资源。 测试

公平调度器也能够在多个队列间工做,如上图所示,例若有两个用户A和B,他们分别拥有一个队列。当A启动一个Job而B没有任务提交时,A会得到所有集群资源;当B启动一个Job后,A的任务会继续运行,不过队列A会慢慢释放它的一些资源,一下子以后两个任务会各自得到一半的集群资源。若是此时B再启动第二个Job而且其它任务也还在运行时,那么它将会和B队列中的的第一个Job共享队列B的资源,也就是队列B的两个Job会分别使用集群四分之一的资源,而队列A的Job仍然会使用集群一半的资源,结果就是集群的资源最终在两个用户之间平等的共享。  大数据

相关参数的配置:

(1)yarn.scheduler.fair.allocation.file: “allocation”文件的位置,“allocation”文件是一个用来描述queue以及它们的属性的配置文件。这个文件必须为格式严格的xml文件。若是为相对路径,那么将会在classpath下查找此文件(conf目录下)。默认值为“fair-scheduler.xml”。 (2)yarn.scheduler.fair.user-as-default-queue:是否将与allocation有关的username做为默认的queue name,当queue name没有指定的时候。若是设置成false(且没有指定queue name) 或者没有设定,全部的jobs将共享“default” queue。默认值为true。 (3)yarn.scheduler.fair.preemption:是否使用“preemption”(优先权,抢占),默认为fasle,在此版本中此功能为测试性的。 (4)yarn.scheduler.fair.assignmultiple:是在容许在一个心跳中,发送多个container分配信息。默认值为false。 (5)yarn.scheduler.fair.max.assign:若是assignmultuple为true,那么在一次心跳中,最多发送分配container的个数。默认为-1,无限制。 (6)yarn.scheduler.fair.locality.threshold.node:一个float值,在0~1之间,表示在等待获取知足node-local条件的containers时,最多放弃不知足node-local的container的机会次数,放弃的nodes个数为集群的大小的比例。默认值为-1.0表示不放弃任何调度的机会。 (7)yarn.scheduler.fair.locality.threashod.rack:同上,知足rack-local。 (8)yarn.scheduler.fair.sizebaseweight:是否根据application的大小(Job的个数)做为权重。默认为false,若是为true,那么复杂的application将获取更多的资源。spa

5、总结

若是业务逻辑比较简单或者刚接触Hadoop的时候建议使用FIFO调度器;若是须要控制部分应用的优先级同时又想要充分利用集群资源的状况下,建议使用Capacity调度器;若是想要多用户或者多队列公平的共享集群资源,那么就选用Fair调度器。但愿你们可以根据业务所需选择合适的调度器。设计

相关文章
相关标签/搜索