hadoop 2.7.2 yarn中文文档—— Capacity Scheduler

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中:


propertyvalue
yarn.resourcemanager.scheduler.classorg.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队列又分别拥有自己的子队列:

<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>

队列的属性配置:

1.资源分配配置

PropertyDescription
yarn.scheduler.capacity.<queue-path>.capacity一个浮点数值,表示该队列占用整个集群资源的比例,所有队列资源的总和等于100%。
如果该队列需要比这个比例更高的资源,而其他队列又有空闲资源的话,
可以占用比这个比例更高的资源。
yarn.scheduler.capacity.<queue-path>
.maximum-capacity
队列的资源使用上限(百分比)。由于存在资源共享,因此一个队列使用的资源量可能超过其容量,
而最多使用资源量可通过该参数限制。
yarn.scheduler.capacity.<queue-path>
.minimum-user-limit-percent
每个用户最低资源保障(百分比)。任何时刻,一个队列中每个用户可使用的资源量均有一定的限制。
当一个队列中同时运行多个用户的应用程序时中,
每个用户的使用资源量在一个最小值和最大值之间浮动,其中,最小值取决于正在运行的应用程序数目,
而最大值则由minimum-user-limit-percent
决定。比如,假设minimum-user-limit-percent为25。当两个用户向该队列提交应用程序时,
每个用户可使用资源量不能超过50%,
如果三个用户提交应用程序,则每个用户可使用资源量不能超多33%,如果四个或者更多用户提交
应用程序,则每个用户可用资源量不能超过25%。
yarn.scheduler.capacity.<queue-path>
.user-limit-factor
每个用户最多可使用的资源量(百分比)。比如,假设该值为30,则任何时刻,每个用户使用的资源
量不能超过该队列容量的30%。
yarn.scheduler.capacity.<queue-path>
.maximum-allocation-mb
每个container的最大内存值,这个配置会覆盖yarn.scheduler.maximum-allocation-mb值,
但是该值必须小于等于系统的yarn.scheduler.maximum-allocation-mb.的值。
yarn.scheduler.capacity.<queue-path>
.maximum-allocation-vcores
与上面类似,这个是限制分配给每个container的cpu核数,
覆盖系统的yarn.scheduler.maximum-allocation-vcores.值,
而且要比系统的值小或者相等。


2.现有的或者新加的应用程序限制配置

PropertyDescription
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
集群中用于运行应用程序ApplicationMaster的资源比例上限,
该参数通常用于限制处于活动状态的应用程序数目。该参数类型为浮点型,
默认是0.1,表示10%。所有队列的ApplicationMaster资源比例上限可通过参数
yarn.scheduler.capacity. maximum-am-resource-percent设置
(可看做默认值),而单个队列可通过参数yarn.scheduler.capacity.<queue-path>
. maximum-am-resource-percent设置适合自己的值。


3.队列的管理和权限控制

PropertyDescription
yarn.scheduler.capacity.<queue-path>.state队列状态可以为STOPPED或者RUNNING,如果一个队列处于STOPPED状态,
用户不可以将应用程序提交到该队列或者它的子队列中,类似的,
如果ROOT队列处于STOPPED状态,用户不可以向集群中提交应用程序,
但正在运行的应用程序仍可以正常运行结束,以便队列可以优雅地退出。
yarn.scheduler.capacity.root.<queue-path>
.acl_submit_applications
限定哪些Linux用户/用户组可向给定队列中提交应用程序。需要注意的是,
该属性具有继承性,即如果一个用户可以向某个队列中提交应用程序,
则它可以向它的所有子队列中提交应用程序。配置该属性时,
用户之间或用户组之间用“,”分割,用户和用户组之间用空格分割,
比如“user1, user2 group1,group2”。
yarn.scheduler.capacity.root.<queue-path>
.acl_administer_queue
为队列指定一个管理员,该管理员可控制该队列的所有应用程序,
比如杀死任意一个应用程序等。同样,该属性具有继承性,
如果一个用户可以向某个队列中提交应用程序,则它可以向它的所有
子队列中提交应用程序。



4.队列和用户、用户组的mapping

PropertyDescription
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。


例如:

 <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>

5.其他一些属性

PropertyDescription
yarn.scheduler.capacity.
resource-calculator
资源比较器设置:默认的是比较内存。Capacity Scheduler
有两种比较器用以比较两个资源的大小
(比如比较用户当前使用的资源量是否超过了设置的上限资源量)
,默认是DefaultResourceCalculator,
它只考虑内存资源。另外一种是DominantResourceCalculator,
它采用了DRF比较算法,
同时考虑内存和CPU两种资源。

PropertyDescription
yarn.scheduler.capacity
.node-locality-delay
当调度次数小于本地延迟调度次数的时候不接受机架调度。
本地延迟调度次数,默认是-1,不开启延迟调度。
而任意调度的延迟调度上限是应用申请的机器的数量,
不能配置。


 

配置

设置ResourceManager使用CapacityScheduler                                               

要配置ResouceManager使用CapacityScheduler,在conf/yarn-site.xml中设置以下属性即可:

yarn.resourcemanager.scheduler.class: org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler

 

配置队列                                                                                                            

etc/hadoop/capacity-scheduler.xml是CapacityScheduler的配置文件。

CapacityScheduler有一个叫做root的预定义的队列。系统中所有队列都是root队列的子队列。

队列可以用一组逗号分隔的子队列设置yarn.scheduler.capacity.root.queues.

CapacityScheduler的配置采用“queue path(队列路径)”的概念来配置队列的层级.queue path是队列层级的的完整路径,从root开始,用英文句点(.)作为分隔符。指定队列的子可以用配置项定义:yarn.scheduler.capacity.<queue-path>.queues.子不能直接从父直接继承属性,除非有特别的声明。

这是一个三个顶级子队列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>

队列属性

  • 资源分配

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.value指定为整数。

 

yarn.scheduler.capacity.<queue-path>.user-limit-factor: 队列容量的倍数,可以设置允许单一用户申请更多的资源。默认值设置为1,这保证了单一用户无法占用超过队列设置的容量,无论集群有多么空闲。属性值指定为浮点数。

 

yarn.scheduler.capacity.<queue-path>.maximum-allocation-mb: 队列为Resource Manager申请的每一个容器分配内存的最大限制。这个配置覆盖集群配置项 yarn.scheduler.maximum-allocation-mb。这个值必须小于或等于集群的最大值。

 

yarn.scheduler.capacity.<queue-path>.maximum-allocation-vcores: 每个队列对Resource Manager申请的每一个容器分配虚拟计算核的最大限制。这个配置覆盖集群配置项yarn.scheduler.maximum-allocation-vcores。这个值必须小于或者等于集群的最大值。

 

  • 运行中和挂起的应用程序的限制

CapacityScheduler支持如下参数用来控制运行中和挂起的应用程序:

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:集群中可以用于运行Application Master的最大资源占比————控制最大并发活跃应用程序数量。限制每一个队列与它的容量和用户限制相称。指定采用浮点数,例如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: 控制谁能提交应用程序到指定队列的访问控制列表(ACLs)。如果给定的用户/组有必要的ACLs在指定的队列或者其父队列,那么他们可以提交应用程序。这个属性的ACLs如果未指定则从其父队列集成。 yarn.scheduler.capacity.root.<queue-path>.acl_administer_queue: 控制谁能管理指定队列上的应用程序的ACL(访问控制列表)。如果给定的用户/组在指定的队列或者父队列有必要的ACLs,那么他们可以管理应用程序,这个属性的ACLs如果未指定则从其父队列集成。

 

备注:ACL采用这种形式:user1,user2空格group1,group2.特定值"*"表示任意一个。特定值“空格”表示没有任何一个。如果没有指定,root队列默认值是*。

 

  • 基于用户或者组的队列映射

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>

其他属性

  • 资源计算器

yarn.scheduler.capacity.resource-calculator: 资源计算的实现用于在调度器中比较资源。默认如org.apache.hadoop.yarn.util.resource.DefaultResourseCalculator只使用内存,然而DominantResourceCalculator 用主导资源比较多维度资源,例如内存,CPU等等。值为java类名。

 

  • 数据本地化

yarn.scheduler.capacity.node-locality-delay: 错失的调度机会数,在这之后CapacityScheduler将会尝试调度本地机架的容器。典型的,应该设置为集群中节点的数量值。默认设置值约等于一个机架的节点数,为40.值为正整数。

 

回顾CapacityScheduler的配置

 

一旦安装并配置完成,YARN集群启动后你可以从web-ui查看。

  • 用正常方式启动YARN集群

  • 打开资源管理器web UI

  • /scheduler web页面显示每个队列的资源使用情况

修改队列配置

修改队列属性、添加新队列是非常简单的。你需要编辑conf/capacity-scheduler.xml 并运行 yarn rmadmin -refreshQueues

$ vi $HADOOP_CONF_DIR/capacity-scheduler.xml
$ $HADOOP_YARN_HOME/bin/yarn rmadmin -refreshQueues

备注:队列不能删除,只支持队列的新增——更新队列配置应该是一个有效值,例如队列容量在每一个层级应该等于100%。



文章出处:http://han-zw.iteye.com/blog/2315893

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值