原文:http://hadoop.apache.org/docs/r2.6.4/hadoop-yarn/hadoop-yarn-site/CapacityScheduler.html
概览
CapacityScheduler被设计用来以一种操作友好的并且最大化吞吐和集群利用率的方式调度一个共享的、多租户集群从而可以支持运行Hadoop应用程序。
传统情况下,每个组织都有自己的私有计算资源组,其可以保证有效容量能满足组织业务的SLA,即便在峰值或接近峰值的情况下也足够。但这通常会导致很差的平均资源利用率以及很大的集群管理开销,一般每个组织需要一个集群。组织间共享集群是一种降低成本的有效手段,尤其是运行大型的Hadoop程序,因为这使他们获得不需要创建私有集群而带来成本降低。然而组织间也会关注如何共享一个集群,因为它们会担心其它人占用资源而影响了自己的SLA。
CapacityScheduler被设计来允许多组织共享一个集群同时给每个组织足够的容量保障。其核心思想是Hadoop集群的可用资源被多个组织共享,其分配的资源量由其在集群中的计算需求而决定。一个额外的好处是一个组织可以使用没有被他人占用的超过自己容量限制的额外资源。这为组织的成本考量提供了弹性。
跨组织的集群共享,必须要确保能支持多租户。因为每个组织必须要保证有容量和安全保障来确保共享集群不被单一的程序、用户或其他东西影响。CapacityScheduler提供了一组严格的限制来确保单一程序或用户或队列不会不适当地消费集群中的资源。同样的,CapacityScheduler提供了限制来初始化和挂起单一用户和队列的应用程序,从而可以确保集群的公平和稳定。
CapacityScheduler能提供的主要抽象是对于队列的概念。这些队列一般由管理员配置,用这些队列来刻画和反映共享集群中的经济状况(成本和资源情况)
为了给共享资源提供更多的控制和可预测性,CapacityScheduler支持层级队列来确保资源可以在一个组织的子队列(sub-queues)里共享,而不被其它组织提前分配掉。也就是提供了一种关联,来保证一个组织拥有在其多个程序之间的空闲资源共享的能力。
特性
CapacityScheduler支持如下特性:
- Hierarchical Queues 层级队列: 队列层级层级队列来确保资源可以在一个组织的子队列(sub-queues)里共享,而不被其它组织提前分配掉。也就是提供了一种关联,来保证一个组织拥有在其多个程序之间的空闲资源共享的能力。这为集群提供了更多的可控性和可预测性。
- Capacity Guarantees容量保证:队列被分配了一系列的容量格子,这些格可以保证这些容量是可以由应用支配的。所有提交到队列的应用程序都可以访问分配给这个队列的资源。管理员可以配置软限制和可选的硬限制来分配每个队列的容量。
- Security安全:每个队列有严格的ACL来控制用户访问和作业提交。同理也有对应的安全防护来保证用户不能查看和修改其他用户的应用程序。每个队列和系统的管理员角色都是支持的。
- Elasticity弹性:空闲资源可以被分配给任意的队列而无视其容量。当又需求来申请这些资源时,这些资源会被分配给对应的队列,前提是这些队列在某个接下来的时刻资源容量低于其队列限制。这就确保了资源以一种可预测和弹性的方式分配给队列,避免了集群中资源的随意使用从而帮助提升利用率。
- Multi-tenancy多租户:提供了广泛的限制来避免一个单一程序或用户或者队列独占集群资源,从而确保集群不会被压垮。
-
Operability可操作性:
- Runtime Configuration运行时配置:队列的定义和属性比如容量、ACL等可以在运行时被改变, 管理员可以操作,当然以一种安全的方式来最小化损害用户。同时,也提供了一个控制台给用户和管理员来查看当前系统各个队列的资源分配情况。管理员可以在运行时添加额外的队列,但是不允许删除队列。
- Drain applications流干应用:管理员可以在运行时停止队列来确保当已存在的应用运行到完成前,没有新的应用可以被提交。如果一个队列处于STOPPED状态,新的应用不允许被提交到这个队列以及任何它的子队列。已有的应用继续执行到完成,这样这个队列就可以优雅地结束掉了(排干)。然后管理员就可以再开启之前停掉的队列。(像个排水管一样停止阀门后排干剩余的水)
- Resource-based Scheduling基于资源调度:支持资源密集应用,当一个应用需要超过默认配置的比较高的资源需求时,利用不同的资源需求配置来调整应用与之适应。当前支持对于内存的资源需求配置调度。
配置
- 设置ResourceManager来使用CapacityScheduler。
在conf/yarn-site.xml中设置如下的属性来配置ResourceManager使用CapacityScheduler:
Property | Value |
---|---|
yarn.resourcemanager.scheduler.class | org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler |
- 设置队列
conf/capacity-scheduler.xml是CapacityScheduler的配置文件。
CapacityScheduler有一个预定义的队列叫做root。系统中所有的队列都是root队列的子队列。
更多的队列可以被设置,通过配置yarn.scheduler.capacity.root.queues来完成,具体配置项是一系列由逗号分隔的队列列表。
CapacityScheduler使用了一个叫做队列路径的概念来配置层级队列。队列路径是队列的层级的全路径,起始是root,用.号作为间隔符。
一个给定队列的子队列,通过一个配置来完成:yarn.scheduler.capacity.< queue-path>.queues。除非单独标记出来,否则子队列不继承父队列的属性。
下面是一个例子,表示了一个3个顶层的子队列a,b和c以及一些a和b的子队列:
<property>
<name>yarn.scheduler.capacity.root.queues</name>
<value>a,b,c</value>
<description>The queues at the this level (root is the root queue).
</description>
</property>
<property>
<name>yarn.scheduler.capacity.root.a.queues</name>
<value>a1,a2</value>
<description>The queues at the this level (root is the root queue).
</description>
</property>
<property>
<name>yarn.scheduler.capacity.root.b.queues</name>
<value>b1,b2,b3</value>
<description>The queues at the this level (root is the root queue).
</description>
</property>
-
队列属性
- 资源分配
Property | Description |
---|---|
yarn.scheduler.capacity.< queue-path>.capacity | 队列的容量,以浮点数表示的百分比%(比如12.5)。在每个层级的队列的容量之和必须等于100。队列中的应用是有可能消费更多的资源的,前提是有空闲资源弹性提供。 |
yarn.scheduler.capacity.< queue-path>.maximum-capacity | 队列的最大容量,以浮点数表示的百分比%。该限制对于队列中的应用来说是弹性的。默认是-1代表无限制。 |
yarn.scheduler.capacity.< queue-path>.minimum-user-limit-percent | 每个队列强制安排一个在任意时间分配给一个用户的资源占比限制,如果有资源需求的话。用户限制可以在最小值和最大值之间变化。最小值由该属性决定,而最大值依赖于已经提交了应用的用户数。比如,如果该值为25,有两个用户提交了应用作业到该队列,那么没有一个用户可以使用超过50%的资源。如果第三个用户提交了应用,那么没有一个用户可以占有超过33%的队列资源。当第四个或者更多用户来提交时,那么没有人能占有超过25%的资源。如果设置为100,那么表示没有用户限制。默认值就是100。此值为一个整数。 |
yarn.scheduler.capacity.< queue-path>.user-limit-factor | 多个队列的容量可以被允许分配给一个用户。默认值是1,表示单一用户占有的资源不可能超过这个队列配置的容量限制,无论这个集群此时有多么空闲。此值是个浮点数。 |
-
运行和挂起应用的限制
CapacityScheduler支持如下参数来控制运行和挂起应用作业:
Property | Description |
---|---|
yarn.scheduler.capacity.maximum-applications / yarn.scheduler.capacity.< queue-path>.maximum-applications | 当前系统支持活动的运行和挂起的最大应用作业数。每个队列的限制直接成比例的依赖于其配置的队列容量和用户限制。这是一个硬性限制,当该限制触发后,任意提交的作业应用都将被拒绝。默认值是10000。这个值也可以被设置对所有队列生效,通过设置yarn.scheduler.capacity.maximum-applications,也可以设置每个队列自己的限制yarn.scheduler.capacity.< queue-path>.maximum-applications。该值是个整数 |
yarn.scheduler.capacity.maximum-am-resource-percent / yarn.scheduler.capacity.< queue-path>.maximum-am-resource-percent | 集群中允许运行应用master的最大资源占比百分比,此值用来控制并行活动的应用数。每个队列的限制直接成比例的依赖于其配置的队列容量和用户限制。一个浮点数,比如0.5=50%。默认是10%。Specified as a float - ie 0.5 = 50%. Default is 10%. 这个值也可以被设置对所有队列生效,通过设置 yarn.scheduler.capacity.maximum-am-resource-percent也可以设置每个队列自己的限制 yarn.scheduler.capacity.< queue-path>.maximum-am-resource-percent |
- 队列管理和权限
CapacityScheduler支持如下的参数来管理队列:
Property | Description |
---|---|
yarn.scheduler.capacity.< queue-path>.state | 队列的状态。可以是RUNNING或者STOPPED。如果一个队列是STOPPED状态,新的应用作业不能被提交到其自身和自己的任何一个子队列里。因此,如果root队列是STOPPED的,那么整个集群将不允许提交作业。已经存在的作业继续运行到完成,这样队列就被优雅的排干了。该参数值是枚举类型。 |
yarn.scheduler.capacity.root.< queue-path>.acl_submit_applications | 控制哪些用户可以提交作业到该队列的ACL。如果指定的用户或组拥有指定队列的ACL或者层级队列中任意一个父队列的ACL,那么他们可以提交应用作业。如果不声明该参数,则队列的ACL从父队列继承。 |
yarn.scheduler.capacity.root.< queue-path>.acl_administer_queue | 控制指定队列的管理应用作业权限的ACL。如果指定的用户或组拥有指定队列或层级队列中任意一个父队列的ACL,那么他们可以管理应用作业。如果不声明该参数,则队列的ACL从父队列继承。 |
注意:ACL的形式如user1, user2spacegroup1, group2。特殊符号*代表任意人。如果不声明,默认的root队列的ACL是任意人。
-
其他属性
- 资源计算器Resource Calculator
Property Description yarn.scheduler.capacity.resource-calculator ResourceCalculator用来在调度器中比较资源。默认实现是org.apache.hadoop.yarn.util.resource.DefaultResourseCalculator,该实现只使用内存。而DominantResourceCalculator使用Dominant-resource来多维度的比较资源,比如一内存、CPU等。此参数值需要时一个Java的ResourceCalculator类名
-
数据位置Data Locality
|Property| Description|
|---|---|
|yarn.scheduler.capacity.node-locality-delay| CapacityScheduler尝试去调度rack-local容器之后允许miss的调度机会次数。一般情况,该值设置为集群中的node数。一个机架默认的设置是40。该参数要求是正整数。|
- 回顾CapacityScheduler的配置
当安装和配置完成后,你可以在启动YARN集群后通过web-ui来review。
- 以normal形式启动YARN。
- 打开ResourceManager的web界面。
- /scheduler页面可以展示每个独立队列的资源使用情况。
改变队列配置
改变队列属性以及添加新队列都是很简单的。你只需要编辑conf/capacity-scheduler.xml
然后运行yarn rmadmin -refreshQueues
。
$ vi $HADOOP_CONF_DIR/capacity-scheduler.xml
$ $HADOOP_YARN_HOME/bin/yarn rmadmin -refreshQueues
注意:队列不能被删除,只有添加新队列操作是支持的,而update更新队列配置需要时一个合法的配置,比如queue-capacity在每个层级队列中需要求和是100%的。