YARN-CapacityScheduler[官网整理]

【YARN-CapacityScheduler】

    此文档描述CapacityScheduler,一个hadoop支持的可插拔的scheduler,它允许“multiple-tenants”(多租户)安全的共享集群资源,所以它们的applications在容量限制之下,可以及时的分配资源。

 

一、Overview

    CapacityScheduler被设计成以“shared”、“multi-tenant”集群,使用操作友好的方式运行hadoop 应用;同时最大化吞吐能力和集群利用率。

 

    传统的,每个organization都有自己私有的一套计算资源,它有足够的容量在峰值情况下满足此organization的SLA(Service-Level Agreement,服务等级协议)。每个organization一个独立的集群,那么在多个独立集群中它通常会导致较差的平均利用率和开销。运行一个较大的hadoop集群,在organizations之间共享集群是一个cost-effective(划算的)的方式,因为它允许organizations从经济规划中获取收益,而无需每个都创建私有的clusters。可是,organizations会关注这个共享集群,因为他们担心其他资源使用者会影响自己的SLA。

 

    CapacityScheduler在给每个organization容量担保的同时,允许共享这个大集群。核心思想是hadoop集群中可用的resources在多个organizations之间共享,根据它们的计算需求获取资源。还有一个额外的好处,organization可以使用那些别人不用的过剩的容量(资源)。这以很划算的方式向organizations提供了弹性。

 

    在organizations之间共享集群必须很好的支持了multi-tenancy,因此每个organization在capacity和safe-guards都需要被保证,以确保共享集群不会因为一个application、一个用户或者用户组等而受到影响。CapacityScheduler提供了严格的限制以确保单个application或者用户不能过度的消耗集群资源。此外,它还限制单个用户和queue初始化、pending应用的个数,以保证公平性和集群的稳定性。

 

    CapacityScheduler提供的核心理念就是Queues,这些queues通常有管理员设定。为了在共享资源上,提供更多的控制和预见性,CapacityScheduler支持多级queue,以确保在其他queues允许使用空闲资源之前,资源可以在一个组织的sub-queues之间共享。

 

[官方文档,生涩难懂]

 

二、Features

    1、Hierarchical Queues:队列层级结构的支持可以确保资源在一个organization的sub-queues之间共享,对于资源,如果sub-queue需要,那么可以被sub-queues共享使用,而不是释放交给其他queue。

    2、Capacity Guarantees:某种意义上,网格中的一部分capacity将会分配给queue。所有提交到此queue的应用都可以访问分配给queue的capacity。管理员可以为每个queue配置容量的soft-limit和hard-limit。

    3、Security:每个queue都有严格的ACL,用来控制哪些用户可以向某个queue提交applications。此外,还提供了安全防护(safe-guards),确保用户不能查看或者修改其他用户的applications。此外,per-queue和系统管理员角色是支持的。

    4、Elasticity:空闲资源可以分配给任何一个queue,甚至超过它们的capacity。在未来的某个时间点上,当运行在低于Capacity的Queues需要这些资源时,当这些资源上运行的task完成后,它们将会被分配给那些运行在低于Capacity的queues。那么这可以保证资源的有效性是可预见的,而且对Queues而言也是弹性的,这样(弹性和预见性)可以避免人为的资源孔洞以提高资源利用率。

    5、Multi-tenancy:提供了很多限制来避免一个application、user和queue(sub-queue)独占(垄断)了一个queue或者整个集群的资源,这些限制用来保障整个集群不会被压垮。

    6、Operability:

        A) Runtime Configuration:queue的定义和属性,比如Capacity、ACLs,管理员可使用安全的方式可以在运行时改变,以最小化中断用户的应用。此外,还向用户和管理员提供了一个console,来观察当前资源在各个Queue上的分配情况。管理员可以在运行时添加新的Queue,但是Queue不能在运行时删除。

        B) Drain applications:管理员可以在运行时停止Queue,其上现有的applications会运行直到完成,不过将不能向此Queue提交新的application。如果一个queue处于“STOPPED”状态,新的application将不能提交到此Queue以及它的sub-queue中。不过Queue上已经存在的application会继续运行,即这个queue可以有好的“drained”。管理员可以重启一个处于“STOPPED”状态的queue。

    7、Resource-based Scheduling:支持资源密集型的应用,可以为某个application指定比默认值更高的资源需求,可以容纳多个资源需求不同的applications。当前,资源需求只支持内存类型。

 

三、配置

    1、设定ResourceManager使用CapacityScheduler

    我们需要修改yarn-site.xml中的配置项,指定Scheduler:

<property>
	<name>yarn.resourcemanager.scheduler.class</name>
	<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value>
</property>

    hadoop 2.2+之后,默认Scheduler就是CapacityScheduler。

    2、设定Queues

    CapacityScheduler将会使用capacity-scheduler.xml作为queue配置文件。CapacityScheduler已经预定义了一个queue:root。系统中所有的queue都是root queue的子节点。其他的queues列表可以通过“yarn.scheduler.capacity.root.queues”中指定,每个queue名称以“,”分割。CapacityScheduler使用了一个称为“queue path”的概念来表示“多级queue”,“queue path”是一个queue层级的全路径,且以“root”开头,路径中以“.”作为分割符。

    一个指定queue的子节点可以通过“yarn.scheduler.capacity.<queue-path>.queues”风格来定义。子节点不从父节点上直接继承properties,除非另有说明。例如,root queue有a,b,c三个子节点,以及a和b也有自己的sub-queue。

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

 

   3、Queue properties[capacity-scheduler.xml]

        A) Resource Allocation:资源分配

  • yarn.scheduler.capacity.<queue-path>.capacity:Queue的容量百分比,float类型,例如12.5。所有Queue的各个层级的capacity总和必须为100。因为弹性资源分配,如果集群中有较多的空闲资源,queue中的application可能消耗比此设定更多的Capacity。
  • yarn.scheduler.capacity.<queue-path>.maximum-capacity:queue capacity最大占比,float类型,此值用来限制queue中的application的弹性的最大值。默认为-1禁用“弹性限制”。
  • yarn.scheduler.capacity.<queue-path>.minimum-user-limit-percent:任何时间如果有资源需要,每个queue都会对分配给一个user的资源有一个强制的限制,这个user-limit可以在最大值和最小值之间。此属性就是最小值,其最大值依赖于提交applications的用户的个数。例如:假设此值为25,如果有2个用户向此queue提交application,那么每个用户最多消耗queue资源容量的50%;如果第三个user提交了application,那么任何一个user使用资源容量不能超过queue的33%;4个或者更多的用户参与,那么每个用户资源使用都不会超过queue的25%。默认值为100,表示对没有用户资源限制。
  • yarn.scheduler.capacity.<queue-path>.user-limit-factor:queue容量的倍数,用来设置一个user可以获取更多的资源。默认值为1,表示一个user获取的资源容量不能超过queue配置的capacity,无论集群有多少空闲资源。此值为float类型。[最多仍不超过maximum-capacity]。

     B) Running and Pending Application limits:运行中和亟待运行的应用限制

  • yarn.scheduler.capacity.maximum-applications:
  • yarn.scheduler.capacity.<queue-path>.maximum-applications:系统中正在运行的和pending(挂起,亟待运行)的applications的最大数量。每个queue上的限制,应该和queue capacity和user限制相互匹配(成比例的,即queue capacity较大,那么可以将此值设定的较大)。这是一个hard limit,如果达到限制,那么提交application将会被拒绝。默认值为10000。可以使用“yarn.scheduler.capacity.maximum-applications”来控制所有的queues,可以通过第二个配置项来对指定的queue-path做限制。
  • yarn.scheduler.capacity.maximum-am-resource-percent:
  • yarn.scheduler.capacity.<queue-path>.maximum-am-resource-percent:集群中用来运行Application masters的资源的占比。用来控制集群中active application的个数(每一个running application都会创建一个ApplicationMaster)。每个Queue上的限制,应该和queue capacity和用户限制相互匹配(成比例的,即queue capacity较大,那么可以将此值设定的较大)。此值为float类型,默认为10。

    C) Queue管理和权限

  • yarn.scheduler.capacity.<queue-path>.state:queue的状态,可以为“STOPPED”/"RUNNING"。如果一个queue为“STOPPED”状态,新的applications将不能提交到此queue以及其sub-queue中。如果root queue的状态为“STOPPED”,那么任何appplications都将无法提交。
  • yarn.scheduler.capacity.root.<queue-path>.acl_submit_applications:ACL用来控制“who”能够想queue-path提交applications。如果user/group持有path或者parent path上必要的ACLs时,他们才能提交applications。如果在某个queue-path上没有特定配置ACLs,那么此queue-path的ACLs将继承parent path。
  • yarn.scheduler.capacity.root.<queue-path>.acl_administer_queue:ACLs用来控制“who”能够管理queue-path下的application。其ACLs继承特性同上。只有具有ACLs的用户或者group才能够管理queue中的applications,包括applications的取消等。

    备注:ACL的格式为"user1,user2SpaceGroup1,group2",用户之间用“,”分割,用户与group之间用“ ”(空格)分割。“*”表示任何人,默认值为“*”。

 

    安装和配置完成之后,即可启动yarn守护进程:“sbin/start-yarn.sh”。此后我们可以通过ResourceManager Web UI查看运行情况。

 

    如果在运行时,添加了queue或者修改了ACLs,可以通过“bin/yarn rmadmin -refreshQueues”来刷新。但是删除Queue是不支持的,需要重启yarn进程。

猜你喜欢

转载自shift-alt-ctrl.iteye.com/blog/2105699
今日推荐