`
han_zw
  • 浏览: 171399 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

hadoop 2.7.2 yarn中文文档—— Capacity Scheduler

 
阅读更多

 

目标

本文档将描述CapacityScheduler,它作为一个可插拔的hadoop调度器,允许多租户安全的共享一个大的集群,在资源分配有限的条件下适时的为应用程序分配资源。

 

综述

CapacityScheduler被设计作为一个共享的、多租户集群用来运行hadoop应用,在操作友好的方式下最大化集群吞吐量和利用率 。

传统的,每个组织(Organization)拥有自己私有的计算资源集,它有足够大的容量来应对该组织的SLA峰值或者接近峰值的条件。这通常会导致比较低的资源利用率以及管理多个独立的集群(每个组织一个)的额外负担. 在不同组织间共享集群是运行大规模hadoop设施的节约成本的方式,不再创建众多私有集群可以让他们在经济上受益。然而,各个组织关心的是如何共享集群,因为他们担心其他组织占用对他们SLA至关重要的资源。CapacityScheduer设计用来允许共享一个大规模的集群,同时给予每个组织一定的资源容量保证。中心思想是hadoop集群中的可用资源基于各个组织的计算需求在其中间共享,各个组织共同资助资源给集群。这样有一个额外的好处是,一个组织能够访问其他组织未使用的超限的资源。这为组织在成本效益方式上提供了弹性。

跨组织的共享集群需要满足对多租户的强支持,因为每个组织必须被保证一定的资源容量和安全保证,确保共享的集群不会受到个别的危险性的应用、用户或者二者组合的影响。CapacityScheduler提供一组严格的限制确保一个独立应用、用户、或者队列会在集群中消费与其自身相称的资源量。另外,CapacityScheduler还会对一个用户和队列的初始化/挂起的应用程序数量提供限制,确保集群的公平和稳定。

CapacityScheduler提供的首要抽象就是“队列"的概念。队列被管理员建立,用来反映共享集群的资源消费情况。

为了进一步对共享资源进行控制和预测,CapacityScheduler支持“层级队列”,以此保证资源在允许其他队列使用当前的空闲资源之前,优先在本组织的子队列间共享,这样就为资源提供组织在共享空闲资源时提供了“亲缘性”。

 

特性

CapacityScheduler支持如下特性:

  • 层级队列——支持队列的层级结构,确保空闲资源在允许其他队列使用前优先在组织内子队列中共享,从而可以提供对共享资源更多的控制和预测能力。

  • 容量保证——队列被分配资源网格中一定比例的容量,换句话说就是一定容量的资源被可以队列处理。所有提交到队列的应用都将访问已经分配给队列的容量。管理员能够配置每个队列分配的容量的软性的限制和可选的硬性限制。

  • 安全——每个队列都有严格的ACL控制用户能够提交应用程序到独立的队列。另外,安全保护机制能够确保用户不能查看和修改其他用户提交的应用程序。每个队列和系统都支持管理员角色。

  • 弹性——空闲资源可以被分配给任意队列,甚至超过其容量。在未来的某个时间点,当运行在较低容量的队列有资源需求时,随着任务在这些资源上调度完成,这些资源将会被分配给运行在较低容量的应用程序。对于队列来说,采用了一种可预测的并且灵活的方式确保资源是随时可获得的。这样阻止了集群中人为的资源储备,提高了资源利用率。

  • 多租户——提供一些列综合的限制条件,阻止一个应用程序、用户、队列霸占整个队列或者集群的资源,确保集群不会压垮。

  • 运维

                
    • 运行时配置——队列的定义和属性,例如:capacity,ACLs可以在运行时被修改,通过管理员采用一种安全的方式可以将对用户的影响降到最低。另外,为用户和管理员提供了控制台,进行查看系统中当前资源分配给哪些队列。管理员能够在运行时新增队列,但是不能在运行时删除。
    • 排干应用程序——管理员能够在运行时停止队列,以此确保新的应用程序不会被提交,已有的应用程序能够运行完成。如果一个队列处在STOPPED状态,新的应用程序不能被提交到队列自身以及它的子队列。已经存在的应用程序可以继续完成,这样队列可以优雅的退出。管理员能够启动和停止队列。
  • 基于资源的调度——支持资源密集型的应用程序,应用程序可以指定比默认值更高的资源需求,并支持不同种类的资源的需求。目前,内存是支持的资源需求。

  • 基于用户和组的队列映射——这个特性基于用户和组能够允许用户映射一个作业到特定的队列。

 

配置

设置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%。

 

下一篇:hadoop 2.7.2 yarn中文文档——Fair Scheduler

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics