yarn框架中调度器的一种-CapacityScheduler,调度器是yarn架构中的resourcemanager的一种可插拔式组件,该组件使得多用户可以共享集群资源,另外一种常用的调度器是Fair Scheduler。再次附上神图:
在HOD架构中,每个用户或者用户组拥有私有的集群,这些集群是动态分配的,但是只有有限的弹性,这可能导致集群的效率低下和数据的局部性,组织间共享集群来运行多用户能提高更好的性能和资源的分配,更好的智能调度,然而,资源共享也带来了应用程序隔离,安全以及资源的竞争问题。capacity调度器解决了这些问题。capacity调度器具有如下特点:
1.多租户弹性
所以的用户组共享一个统一的yarn管理的总资源,在此前提下,用户以及用户组共享整个资源,属于某个用户组的资源在空闲的时候可以分配给资源紧缺的用户组,同时,yarn保证每个组有资源可用,capacity调度器通过队列的容量,最小用户占用比和限制来支持这些特性。同时,capacity调度器严格执行限制来避免个人或某个组独占集群资源从而影响其他组队列任务的行为。
2.安全
为管理员用户提供访问控制列表ACL之类的工具来解决跨组织的安全问题。
3.资源感知
目前capacity调度器只支持CPU和内存两种资源的管理。
4.细粒度调度
不再将一个节点以静态的方式分配给队列。yarn中的队列仅仅是一个在物理节点上的逻辑资源视图。这样可以使应用程序,用户或者用户组共享单个节点。
5.本地化
capacity调度器支持应用程序指定计算任务的执行节点。尽量在指定的节点或者机架上运行程序,也尽量在接近的节点或者机架上分配资源。
6.调度策略
FIFO调度策略。
capacity调度器是hadoop默认的调度器(Apache版,cdh默认调度器是fair),在yarn-site.xml中:
property |
value |
yarn.resourcemanager.scheduler.class |
org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler |
capacity调度器本身依赖于一个自己的配置文件:capacity-scheduler.xml文件,这个文件放在RM的classpath中,一般是conf目录下。调度器会在启动或者管理员修改该文件的时候加载它。可以按照需要编辑这个capacity-scheduler.xml文件,修改后需要执行命令:
$ yarn rmadmin -refreshQueues
这个命令只能由集群管理员来运行,管理员的配置文件时yarn.admin.acl来配置的,可以配置用户名列表。
yarn中基本的调度单位是队列,一个队列是多个用户提交的应用程序或者多个队列的逻辑集合。队列有如下属性:
队列名
队列路径
子队列或者应用程序列表
最大容量和最小容量
队列状态
ACL控制信息
CapacityScheduler 有一个预先定义好的队列叫做root,所有的队列都是该队列的子节点。CapacityScheduler 使用一种称为队列路径的概念来表示队列的层次结构,该层次结构起始于root节点,以root.xxx 的形式来描述该节点的路径。下面是一个例子,abc三个队列是root的子队列,ab队列又分别拥有自己的子队列:
yarn.scheduler.capacity.root.queues
a,b,c
The queues at the this level (root is the root queue).
yarn.scheduler.capacity.root.a.queues
a1,a2
The queues at the this level (root is the root queue).
yarn.scheduler.capacity.root.b.queues
b1,b2,b3
The queues at the this level (root is the root queue).
队列的属性配置:
1.资源分配配置
Property |
Description |
yarn.scheduler.capacity. |
一个浮点数值,表示该队列占用整个集群资源的比例,所有队列资源的总和等于100%。 如果该队列需要比这个比例更高的资源,而其他队列又有空闲资源的话, 可以占用比这个比例更高的资源。 |
yarn.scheduler.capacity. .maximum-capacity |
队列的资源使用上限(百分比)。由于存在资源共享,因此一个队列使用的资源量可能超过其容量, 而最多使用资源量可通过该参数限制。 |
yarn.scheduler.capacity. .minimum-user-limit-percent |
每个用户最低资源保障(百分比)。任何时刻,一个队列中每个用户可使用的资源量均有一定的限制。 当一个队列中同时运行多个用户的应用程序时中, 每个用户的使用资源量在一个最小值和最大值之间浮动,其中,最小值取决于正在运行的应用程序数目, 而最大值则由minimum-user-limit-percent 决定。比如,假设minimum-user-limit-percent为25。当两个用户向该队列提交应用程序时, 每个用户可使用资源量不能超过50%, 如果三个用户提交应用程序,则每个用户可使用资源量不能超多33%,如果四个或者更多用户提交 应用程序,则每个用户可用资源量不能超过25%。 |
yarn.scheduler.capacity. .user-limit-factor |
每个用户最多可使用的资源量(百分比)。比如,假设该值为30,则任何时刻,每个用户使用的资源 量不能超过该队列容量的30%。 |
yarn.scheduler.capacity. .maximum-allocation-mb |
每个container的最大内存值,这个配置会覆盖yarn.scheduler.maximum-allocation-mb值, 但是该值必须小于等于系统的yarn.scheduler.maximum-allocation-mb.的值。 |
yarn.scheduler.capacity. .maximum-allocation-vcores |
与上面类似,这个是限制分配给每个container的cpu核数, 覆盖系统的yarn.scheduler.maximum-allocation-vcores.值, 而且要比系统的值小或者相等。 |
2.现有的或者新加的应用程序限制配置
Property |
Description |
yarn.scheduler.capacity.maximum-applications /yarn.scheduler.capacity. .maximum-applications |
集群或者队列中同时处于等待和运行状态的应用程序数目上限,这是一个强限制, 一旦集群中应用程序数目超过该上限,后续提交的应用程序将被拒绝,默认值为10000。 所有队列的数目上限可通过参数yarn.scheduler.capacity.maximum-applications 设置(可看做默认值),而单个队列可通过参数yarn.scheduler.capacity. |
yarn.scheduler.capacity.maximum-am-resource-percent /yarn.scheduler.capacity. .maximum-am-resource-percent |
集群中用于运行应用程序ApplicationMaster的资源比例上限, 该参数通常用于限制处于活动状态的应用程序数目。该参数类型为浮点型, 默认是0.1,表示10%。所有队列的ApplicationMaster资源比例上限可通过参数 yarn.scheduler.capacity. maximum-am-resource-percent设置 (可看做默认值),而单个队列可通过参数yarn.scheduler.capacity. . maximum-am-resource-percent设置适合自己的值。 |
3.队列的管理和权限控制
Property | Description |
yarn.scheduler.capacity. |
队列状态可以为STOPPED或者RUNNING,如果一个队列处于STOPPED状态, 用户不可以将应用程序提交到该队列或者它的子队列中,类似的, 如果ROOT队列处于STOPPED状态,用户不可以向集群中提交应用程序, 但正在运行的应用程序仍可以正常运行结束,以便队列可以优雅地退出。 |
yarn.scheduler.capacity.root. .acl_submit_applications |
限定哪些Linux用户/用户组可向给定队列中提交应用程序。需要注意的是, 该属性具有继承性,即如果一个用户可以向某个队列中提交应用程序, 则它可以向它的所有子队列中提交应用程序。配置该属性时, 用户之间或用户组之间用“,”分割,用户和用户组之间用空格分割, 比如“user1, user2 group1,group2”。 |
yarn.scheduler.capacity.root. .acl_administer_queue |
为队列指定一个管理员,该管理员可控制该队列的所有应用程序, 比如杀死任意一个应用程序等。同样,该属性具有继承性, 如果一个用户可以向某个队列中提交应用程序,则它可以向它的所有 子队列中提交应用程序。 |
4.队列和用户、用户组的mapping
Property | Description |
yarn.scheduler.capacity .queue-mappings |
这个参数指定user和用户组(group)属于哪个queue。 可以指定一格user或者一组user属于这个队列。语法是: [u or g]:[name]:[queue_name][,next_mapping]* 这里的u和g指定这个mapping是对于user还是对 group的mapping。name代表是username还是groupname。 (To specify the user who has submitted the application, %user can be used. queue_name indicates the queue name for which the application has to be mapped. To specify queue name same as user name, %user can be used. To specify queue name same as the name of the primary group for which the user belongs to, %primary_group can be used.) |
yarn.scheduler.capacity.queue-mappings -override.enable |
指定user指定的队列是否可以被覆盖,默认为false。 |
例如:
Here,
maps users to queues with the same name as user,
to queue name same as
evaluated from left to right, and the first valid mapping will be used.
5.其他一些属性
Property | Description |
yarn.scheduler.capacity. resource-calculator |
资源比较器设置:默认的是比较内存。Capacity Scheduler 有两种比较器用以比较两个资源的大小 (比如比较用户当前使用的资源量是否超过了设置的上限资源量) ,默认是DefaultResourceCalculator, 它只考虑内存资源。另外一种是DominantResourceCalculator, 它采用了DRF比较算法, 同时考虑内存和CPU两种资源。 |
Property |
Description |
yarn.scheduler.capacity .node-locality-delay |
当调度次数小于本地延迟调度次数的时候不接受机架调度。 本地延迟调度次数,默认是-1,不开启延迟调度。 而任意调度的延迟调度上限是应用申请的机器的数量, 不能配置。 |
总结:
修改配置的步骤:
1.修改conf/capacity-scheduler.xml
$ vi $HADOOP_CONF_DIR/capacity-scheduler.xml
2.刷新操作:
$ $HADOOP_YARN_HOME/bin/yarn rmadmin -refreshQueues
参考文章:
http://hadoop.apache.org/docs/r2.7.1/hadoop-yarn/hadoop-yarn-site/CapacityScheduler.html
http://dongxicheng.org/mapreduce-nextgen/hadoop-yarn-configurations-capacity-scheduler/
《yarn权威指南》