本文固定链接:https://www.askmac.cn/archives/hadoop-capacity-scheduler.html
原文地址:http://hadoop.apache.org/docs/current/hadoop-yarn/hadoop-yarn-site/CapacityScheduler.html
1.目的
这个文档描述CapacityScheduler,在hadoop中一个可拔插的调度,允许多个租户安全的共享一个大的集群,这样他们的应用程序可以在分配能力的约束下,及时分配资源。
2.概述
CapacityScheduler 被设计用来共享的运行Hadoop 应用程序,以友好操作方式进行多租户集群,同时最大化吞吐量和集群的利用率。(www.askmac.cn)
传统的,每个组织有其私有的计算资源集,有足够的能力满足在峰值或者接近峰值条件下的SLA。这通常会导致较差的平均利用率和管理多个独立的集群,每一个组织管理开销。在组织之间共享集群时一个有效的运行大hadoop的方式。因为这个可以让它们获得更好的规模效益而不用创建私人的集群。但是,这些组织关系共享集群的使用,因为它们担心它们的SLAs的重要资源。
CapacityScheduler 被设计用来允许共享一个大的集群,同时给予各组织能力保证。其中的中心思想是,Hadoop集群中的可用资源被多个组织共享,基于它们的需求计算。这里有一个额外的好处是,一个组织可以访问任何多余的不被其他人使用的容量。这为组织提供了具有成本效益的弹性方式。
跨组织共享集群必须有强大的支持多租户,因为每个组织必须保证能力和安全,来确保共享集群对于单个应用程序或用户或集是不受影响的。
CapacityScheduler提供了一个严格的限制,以确保一个单一的应用程序或用户或队列不能消耗集群中不成比例的资源。同时,CapacityScheduler提供了从单一用户和队列的初始化/暂停 应用程序限制,来确保集群的公平性和稳定性。
由CapacityScheduler提供的主要抽象是队列的概念。这些队列通常由管理员设置,以反映共享集群的经济情况。
为了在共享资源上提供更多的控制和可预测性,CapacityScheduler提供分层队列来确保在子队列中的资源,在其他队列被允许使用空闲资源之前是被共享的,在这里提供在给定组织的应用程序中,共享空闲资源的能力。
3.特性
CapacityScheduler 支持下列特性:
1.层次化队列 -分层队列来确保在子队列中的资源,在其他队列被允许使用空闲资源之前是被共享的,并提供了更多的控制和可预测性。(www.askmac.cn)
2.能力(capacity)担保 – 队列在网格上分配了一小部分能力,在这个意义上,一定能力的资源将被它们处置。所有的应用进程提交给一个队列将访问分配给队列的能力。管理员可以配置分配给每个队列上能力的软限制和操作硬限制。
3.安全 –每个队列有严格的ACLs可以控制,用户可以提交应用程序到个人的队列中。此外,有安全卫士保证用户不能查看或修改其他用户的应用程序。并且也支持每个队列和系统管理员角色。
4.弹性 –空闲资源可以被分配给任何队列超出其能力。当有需求从运行队列底层能力中,在未来一个时间点获取资源时,在这些资源完成调度任务后,他们将被分配到运行的队列底层能力中(不支持优先权)。这确保了资源可在一个可预测的和弹性的方式队列中,从而防止在集群中出现人工孤岛的资源,有助于利用。
5.多租户 – 广泛的限制提供了阻止单一应用程序,用户和队列独占队列或集群的资源,并保证集群不会被压垮。
6.可操作性
运行时的配置 – 队列的定义和性质,例如能力,ACLs可以在运行时变更,通过管理员以安全的方式,尽量减少对用户的干扰。此外,为用户和管理员提供了一个控制台,来查看当前系统中各种队列的当前分配的资源。管理员可以在运行时添加额外的队列,但不能在运行时删除队列。(www.askmac.cn)
Drain应用程序 –管理员可以在运行时停止队列,以确现有的应用程序直到运行完成,但是没有新的应用程序可以提交。如果队列是在STOPPED状态,新的应用程序无法提交到本身或其任何子队列。现在的应用程序继续完成,因此队列可以优雅的退出。管理员也可以启动已停止的队列。
7.基于资源的调度 – 支持资源密集型应用程序,在一个应用程序中可以选择指定比默认更高的资源需求,那里容纳不同资源需求的应用程序。目前为止,内存是支持的资源需求。
8.基于用户或组的队列映射 – 此功能允许用户将作业映射到基于用户或组的特定队列中。
4.配置
4.1 设置 ResourceManager 来使用CapacityScheduler
在conf/yarn-site.xml 中设置如下如下:(www.askmac.cn)
属性 | 值 |
yarn.resourcemanager.scheduler.class | org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler |
4.2 设置队列
etc/hadoop/capacity-scheduler.xml 是CapacityScheduler的配置文件。
CapacityScheduler 有一个预定义的队列,被称为root。系统中所有的队列都是root队列的子队列。
之后的队列可以被配置在yarn.scheduler.capacity.root.queues中,是一个逗号分隔的子队列列表。
CapacityScheduler的配置使用一个叫做队列路径的概念,来配置队列的层级。队列路径是队列层级的完整路径,从root开始,点号(.)作为分隔符。
一个给定的队列的子队列可以被knob配置定义:yarn.scheduler.capacity.<queue-path>.queues。子队列不直接从父亲继承属性,除非有特殊说明。
这里有一个例子,3个顶层的子队列,a,b,c,和一些a,b的子队列:(www.askmac.cn)
<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>
4.3 队列属性
资源分配
属性 | 描述 |
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%的资源。如果3个用户提交一个拥有程序,那么单一用户不能使用超过队列资源的33%。如果有4或以上的用户,没有用户可以使用超过25%的队列资源。100意味着没有用户限制。默认是100,值被指定为一个整数。 |
yarn.scheduler.capacity.<queue-path>.user-limit-factor | 可以被配置允许单个用户在多个队列能力中获得更多资源。默认是1,确保单一用户不能超过队列配置的能力,不论集群是否空闲。值是一个浮点型。 |
yarn.scheduler.capacity.<queue-path>.maximum-allocation-mb | 每个队列的最大内存限制,分配给资源管理器中的每个容器请求。此设置将覆盖群集配置yarn.scheduler.maximum-allocation-mb。此值必须小于或等于群集最大值。 |
yarn.scheduler.capacity.<queue-path>.maximum-allocation-vcores | 在Resource Manager中分配给每个容器请求的每个队列的最大虚拟核心限制。此设置将覆盖群集配置yarn.scheduler.maximum-allocation-vcores。此值必须小于或等于群集最大值。 |
运行时和挂起时应用程序限制
属性 | 描述 |
yarn.scheduler.capacity.maximum-applications / yarn.scheduler.capacity.<queue-path>.maximum-applications | 在系统中可同时激活运行和挂起的最大应用程序数目。每个队列的限制是直接与他们队列的能力和用户限制成比例。这是一个硬限制,并且当达到这个限制时,任何应用程序提交会被拒绝。默认是1000.可以设置在所有队列上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 | 集群中的资源的最大百分比,可以用来运行主应用程序-控制并发活动应用程序的数量。每个队列的限制是直接与他们的队列容量和用户限制成正比。指定是一个浮点数,例如0.5=50%。默认是10%。可以使用yarn.scheduler.capacity.maximum-am-resource-percent对所有队列设置,也可以使用yarn.scheduler.capacity.<queue-path>.maximum-am-resource-percent在队列基础上进行覆盖 设置。 |
队列管理和权限
CapacityScheduler 支持下列队列的管理参数:
属性 | 描述 |
yarn.scheduler.capacity.<queue-path>.state | 队列的状态可以是RUNNING或者STOPPED。如果队列是STOPPED状态,新的应用程序不能提交本身或其任何的子队列。因此,如果root队列是STOPPED,没有任何程序可以提交给整个集群。现有的应用程序继续完成,因此队列可以优雅地退出。值被指定为枚举类型。 |
yarn.scheduler.capacity.root.<queue-path>.acl_submit_applications | ACL控制谁可以提交应用程序给队列。如果指定的用户/组在给定的队列或者在一个层级的父队列上有必须的acls,那么其可以提交应用程序。如果未指定,ACL的属性从父队列继承。 |
yarn.scheduler.capacity.root.<queue-path>.acl_administer_queue | ACL控制谁可以管理特定队列的应用程序。如果指定的用户/组在给定的队列或者在一个层级的父队列上有必须的acls,那么其可以管理应用程序。如果未指定,ACL的属性从父队列继承。 |
注意:ACL的形式是user1, user2spacegroup1, group2。指定值为*表示任何人。指定为空表示没有。默认是*为root队列,如果没指定的话。(www.askmac.cn)
基于用户或组的队列映射
CapacityScheduler 支持下列参数配置基于用户或组的队列映射:
属性 | 描述 |
yarn.scheduler.capacity.queue-mappings | 这种配置指定了用户或组的具体队列的映射。你可以将单个用户或一个用户列表映射到队列中。语法:[u or g]:[name]:[queue_name][,next_mapping]*。这里,u或者g表示是否是用户或组。这个值是u是用户,g是组。Name表示用户名或组名。要指定已提交应用程序的用户,可以使用%user。queue_name 表示已经被映射应用程序的队列名。要指定队列名和用户名一样,可以使用%user。要指定队列名和用户属于的主组名一样,可以使用%primary_group。 |
yarn.scheduler.capacity.queue-mappings-override.enable | 这个函数被用来指定,用户指定的队列是否可被重写。这个是一个布尔值,默认是false |
例子:
<property><name>yarn.scheduler.capacity.queue-mappings</name> <value>u:user1:queue1,g:group1:queue2,u:%user:%user,u:user2:%primary_group</value> <description> Here, <user1> is mapped to <queue1>, <group1> is mapped to <queue2>, maps users to queues with the same name as user, <user2> is mapped to queue name same as <primary group> respectively. The mappings will be evaluated from left to right, and the first valid mapping will be used. </description> </property>
4.4 其他属性
- Resource Calculator
属性 | 描述 |
yarn.scheduler.capacity.resource-calculator | 实现ResourceCalculator被用来比较在调度中的资源。默认是例如org.apache.hadoop.yarn.util.resource.DefaultResourseCalculator只使用内存,而DominantResourceCalculator使用优势资源来进行多维的比较,例如内存,CPU等等。需要一个java ResourceCalculator 类名 |
- Data Locality
属性 | 描述 |
yarn.scheduler.capacity.node-locality-delay | 在CapacityScheduler 视图调度本地机架的容器之后,丢失的调度机会数目。通常情况下,这个应该被设置为集群中的节点数。默认情况下设置在一个机架上的节点数为40。正整数值。 |
4.5 检查CapacityScheduler的配置
一旦安装和配置完成,你可以在启动YARN集群之后从web-ui上检查。
1.正常方式启动YARN集群
2.在打开WEB UI ResourceManager
3.在/scheduler web页面应该显示单个队列的资源使用。(www.askmac.cn)
5.变更队列配置
变更队列属性和增加新队列是很简单的。你可以编辑conf/capacity-scheduler.xml,然后运行yarn rmadmin –refreshQueues命令。
vi $HADOOP_CONF_DIR/capacity-scheduler.xml $HADOOP_YARN_HOME/bin/yarn rmadmin -refreshQueues
注意:队列不能被删除,只支持增加新队列-更新队列配置应该是有效的。例如队列-登录在每个级别应该等于100%。
Comment