Hadoop: Capacity Scheduler yarn容量调度

本文描述了 CapacityScheduler,这是一种可插拔的 Hadoop 调度器,它允许多租户安全地共享一个大型集群,从而在分配容量的限制下及时为其应用程序分配资源。

概述

CapacityScheduler 旨在以一种对操作人员友好的方式将 Hadoop 应用程序作为一个共享的多租户集群运行,同时最大化吞吐量和集群的利用率。

传统上,每个租户都有自己的私有计算资源集,这些资源有足够的能力满足租户在峰值或接近峰值条件下的 SLA(服务等级协议)。这通常会导致较差的平均利用率和管理多个独立集群(每个租户一个)的开销。在租户之间共享集群是运行大型 Hadoop 安装的一种成本效益高的方式,因为这允许它们在不创建私有集群的情况下获得规模经济效益。然而,租户关心共享集群,因为他们担心其他人使用对他们的sla至关重要的资源。

CapacityScheduler 旨在允许共享大型集群,同时为每个租户提供容量保证。其核心思想是 Hadoop 集群中的可用资源在多个租户之间共享,这些租户根据各自的计算需求共同资助集群。还有一个额外的好处就是租户可以访问任何没有被其他人使用的过剩容量。这以一种经济有效的方式为租户使用资源提供了灵活性。

跨租户共享集群需要对多租户提供强大的支持,因为每个租户都必须保证容量和安全保障,以确保共享集群不受单个恶意应用程序或用户的影响。CapacityScheduler 提供了一组严格的限制,以确保单个应用程序、用户或队列不会不成比例地消耗集群中的资源。此外,CapacityScheduler 对来自单个用户和队列的初始化和挂起应用程序提供了限制,以确保集群的公平性和稳定性。

容量调度器提供的主要抽象是队列的概念。这些队列通常由管理员设置,以反映共享集群的经济效益。

提供进一步控制对共享资源和可预测性,CapacityScheduler 支持分级队列,确保资源共享租户的 sub-queues 之前其他队列允许使用免费资源,从而提供关联的应用程序之间共享免费资源一个给定的租户。

特点

容量调度器支持以下功能:

  • Hierarchical Queues - 支持队列层次结构,以确保在允许其他队列使用空闲资源之前,在租户的子队列之间共享资源,从而提供更多的控制和可预测性。

  • Capacity Guarantees - 队列被分配到网格容量的一小部分,也就是说,将有一定的资源容量供其使用。所有提交到队列的应用程序都可以访问分配给队列的容量。管理员可以配置分配给每个队列的容量的软限制和可选的硬限制。

  • Security - 每个队列都有严格的 acl,用于控制哪些用户可以向单个队列提交应用程序。另外,还有一些安全保护措施可以确保用户不能查看和/或修改来自其他用户的应用程序。此外,还支持每个队列和系统管理员角色。

  • Elasticity - 可以将空闲资源分配给超出其容量的任何队列。当未来某个时间点上运行的容量不足的队列对这些资源有需求时,随着在这些资源上调度的任务完成,它们将被分配给容量不足的队列上的应用程序(也支持抢占)。这确保了资源以可预测的、弹性的方式可用于队列,从而防止了集群中资源的人工竖井,从而有助于利用资源。

  • Multi-tenancy - 提供了一组全面的限制,以防止单个应用程序、用户和队列作为一个整体独占队列或集群的资源,以确保集群不会过载。

  • Operability

    • 运行时配置——管理员可以在运行时以安全的方式更改队列定义和属性(如容量、acl),以最大限度地减少对用户的干扰。此外,还提供了一个控制台,供用户和管理员查看系统中各种队列的当前资源分配情况。管理员可以在运行时添加其他队列,但不能在运行时删除队列,除非队列已停止,并且没有挂起/运行的应用程序。

    • Drain applications - 管理员可以在运行时停止队列,以确保在现有应用程序运行到完成时,不会提交新的应用程序。如果队列处于停止状态,则不能将新应用程序提交给它自己或它的任何子队列。现有的应用程序将继续完成,因此可以优雅地释放队列。管理员还可以启动已停止的队列。

  • Resource-based Scheduling - 支持资源密集型应用程序,其中应用程序中可以选择性地指定比默认值更高的资源需求,从而适应不同资源需求的应用程序。目前,内存是支持的资源需求。

  • Queue Mapping Interface based on Default or User Defined Placement Rules - 该特性允许用户基于某些默认放置规则将作业映射到特定队列。例如,根据用户和组或应用程序名称。用户也可以定义自己的放置规则。

  • Priority Scheduling - 该特性允许以不同的优先级提交和调度应用程序。较高的整数值表示应用程序的优先级较高。目前,应用程序优先级仅支持 FIFO 排序策略。

  • Absolute Resource Configuration - 管理员可以为队列指定绝对资源,而不是提供基于百分比的值。这为管理员配置给定队列所需的资源量提供了更好的控制。

  • Dynamic Auto-Creation and Management of Leaf Queues - 该特性支持自动创建叶队列和队列映射,队列映射目前支持基于用户组的队列映射,用于将应用程序放置到队列中。调度器还支持基于父队列上配置的策略对这些队列进行容量管理。

配置

设置 ResourceManager 以使用容量调度

要将 ResourceManager 配置为使用容量调度器,请在 conf/yarn-site.xml 中设置以下属性:

Property Value
yarn.resourcemanager.scheduler.class org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler

设置队列

CapacityScheduler 的配置文件是 etc/hadoop/capacity-scheduler.xml,CapacityScheduler 有一个预定义的名为 root 的队列。系统中的所有队列都是 root 队列的子队列。可以通过配置 yarn.scheduler.capacity.root 来设置更多的队列。带有逗号分隔子队列列表的队列。CapacityScheduler 的配置使用名为队列路径的概念来配置队列的层次结构。队列路径是队列层次结构的完整路径,从根开始.(点)作为分隔符。一个给定队列的子队列可以通过配置:yarn.scheduler.capacity..queues。除非另有说明,子元素不会直接从父元素继承属性。

下面是一个包含三个顶级子队列 a、b 和 c 以及一些用于 a 和 b 的子队列的示例:


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

队列配置

资源配置

Property Description
yarn.scheduler.capacity..capacity 队列容量的百分比(%)、浮点数(例如12.5)或绝对资源队列最小容量。每个级别上所有队列的容量总和必须等于100。但是如果配置了绝对资源,子队列的绝对资源总和可能小于其父队列的绝对资源容量。如果有空闲资源,队列中的应用程序消耗的资源可能超过队列的容量,从而提供灵活性。
yarn.scheduler.capacity..maximum-capacity 最大队列容量的百分比(%)作为一个浮动或绝对资源队列最大容量。这限制了队列中应用程序的灵活性。1)值在0到100之间。2) Admin需要确保绝对最大容量>=每个队列的绝对容量。此外,将该值设置为-1将最大容量设置为100%。
yarn.scheduler.capacity..minimum-user-limit-percent 如果有资源需求,每个队列在任何给定时间都对分配给用户的资源百分比施加限制。用户限制可以在最小值和最大值之间变化。前者(最小值)设置为此属性值,后者(最大值)取决于提交应用程序的用户数量。例如,假设这个属性的值是25。如果两个用户向一个队列提交了应用程序,那么任何一个用户都不能使用超过50%的队列资源。如果第三个用户提交了一个应用程序,没有一个用户可以使用t的33%以上
yarn.scheduler.capacity..user-limit-factor 多个队列容量,可配置为允许单个用户获取更多资源。默认情况下,这个值被设置为1,这确保了无论集群有多空闲,单个用户都不会占用超过队列配置的容量。值被指定为一个浮点数。
yarn.scheduler.capacity..maximum-allocation-mb 在资源管理器上分配给每个容器请求的每个队列的最大内存限制。此设置覆盖集群配置yarn.scheduler.maximum-allocation-mb。这个值必须小于或等于集群的最大值。
yarn.scheduler.capacity..maximum-allocation-vcores 资源管理器上分配给每个容器请求的每个队列虚拟核的最大限制。此设置覆盖集群配置yarn.scheduler.maximum-allocation-vcores。这个值必须小于或等于集群的最大值。
yarn.scheduler.capacity..user-settings..weight 在为队列中的用户计算用户限制资源值时使用此浮点值。这个值将使每个用户的权重大于或小于队列中的其他用户。例如,如果用户A在队列中接收到的资源比用户B和C多50%,那么对于用户A,这个属性将被设置为1.5。用户B和C默认为1.0。

使用绝对资源配置进行资源分配

CapacityScheduler 支持绝对资源配置,而不是按百分比提供队列容量。正如在上面的配置小节中提到的,yarn.scheduler.capacity..capatity 和 yarn.scheduler.capacity.< queue-path >.max-capacity,管理员可以指定一个绝对资源值,如[memory=10240,vcores=12]。这是一个有效的配置,表示10GB内存和12个vcore。

运行和挂起应用程序限制

容量调度器支持以下参数来控制运行和挂起的应用程序:

Property Description
yarn.scheduler.capacity.maximum-applications / yarn.scheduler.capacity..maximum-applications 系统中可以同时活动、运行和挂起的应用程序的最大数量。每个队列上的限制与它们的队列容量和用户限制成正比。这是一个硬限制,当达到这个限制时提交的任何申请都将被拒绝。默认是10000。可以为所有具有yarn.scheduler.capacity的队列设置此设置。也可以通过设置yarn.scheduler.capacity..maximum-applications来覆盖每个队列。整型值的预期。
yarn.scheduler.capacity.maximum-am-resource-percent / yarn.scheduler.capacity..maximum-am-resource-percent 集群中可用于运行应用程序主程序的最大资源百分比——控制并发活动应用程序的数量。每个队列上的限制与它们的队列容量和用户限制成正比。指定为浮点数-即0.5 = 50%。默认是10%。可以为所有具有yarn.scheduler.capacity的队列设置此设置。也可以通过设置yarn.scheduler.capacity.<队列路径>.maximum-am-resource-percent来覆盖每个队列

队列管理和权限

容量调度器支持以下参数来管理队列

Property Description
yarn.scheduler.capacity..state 队列的状态。可以是 RUNNING 或 STOPPED。如果队列处于停止状态,则不能将新应用程序提交给它自己或它的任何子队列。因此,如果根队列被停止,就不能向整个集群提交任何应用程序。现有的应用程序将继续完成,因此可以优雅地释放队列。值指定为枚举。
yarn.scheduler.capacity.root..acl_submit_applications ACL,用于控制谁可以向给定队列提交应用程序。如果给定用户/组在给定队列或层次结构中的一个父队列上具有必要的acl,则可以提交应用程序。如果未指定,此属性的acl将从父队列继承。
yarn.scheduler.capacity.root..acl_administer_queue ACL,用于控制谁可以管理给定队列上的应用程序。如果给定用户/组在给定队列或层次结构中的一个父队列上具有必要的acl,则可以管理应用程序。如果未指定,此属性的acl将从父队列继承。

注意:ACL 的形式是 user1、user2空间group1和group2。*的特殊价值意味着任何人。空间的特殊价值并不意味着任何人。如果未指定,根队列的默认值是*。

基于用户或组、应用程序名称或用户定义的放置规则的队列映射

CapacityScheduler支持以下参数来根据用户或组、用户和组或应用程序名称配置队列映射。用户也可以定义自己的放置规则

Property Description
yarn.scheduler.capacity.queue-mappings 此配置指定用户或组到特定队列的映射。您可以将单个用户或用户列表映射到队列。语法:[u或g]:[name]:[queue_name][,next_mapping]*。这里,u或g表示映射是针对用户还是针对组。值是u代表用户,g代表组。name表示用户名或组名。要指定提交应用程序的用户,可以使用%user。queue_name表示应用程序必须为其映射的队列名称。若要指定与用户名相同的队列名称,可以使用%user。若要指定与用户所属的主组名称相同的队列名称,可以使用 %primary_group。辅助组可以引用为 %secondary_group
yarn.scheduler.queue-placement-rules.app-name 此配置指定 application_name 到特定队列的映射。您可以将单个应用程序或应用程序列表映射到队列。语法:[app_name]: [queue_name] [next_mapping] *。这里,app_name表示要进行映射的应用程序名称。queue_name表示应用程序必须为其映射的队列名称。要将当前应用程序的名称指定为app_name,可以使用%application。
yarn.scheduler.capacity.queue-mappings-override.enable 此函数用于指定是否可以覆盖用户指定的队列。这是一个布尔值,默认值为false。

下面的示例分别介绍了单个映射。对于使用逗号分隔值的多个映射,求值将从左到右,并且将使用第一个有效映射。下面的示例顺序是根据多个映射在运行时的实际执行顺序记录的。


    yarn.scheduler.capacity.queue-mappings
    u:%user:%primary_group.%user
    Maps users to queue with the same name as user but
    parent queue name should be same as primary group of the user
 
 ...
 
    yarn.scheduler.capacity.queue-mappings
    u:%user:%secondary_group.%user
    Maps users to queue with the same name as user but
    parent queue name should be same as any secondary group of the user
 
 ...
 
    yarn.scheduler.capacity.queue-mappings
    u:%user:%user
    Maps users to queues with the same name as user
 
 ...
 
    yarn.scheduler.capacity.queue-mappings
    u:user2:%primary_group
    user2 is mapped to queue name same as primary group
 
 ...
 
    yarn.scheduler.capacity.queue-mappings
    u:user3:%secondary_group
    user3 is mapped to queue name same as secondary group
 
 ...
 
    yarn.scheduler.capacity.queue-mappings
    u:user1:queue1
    user1 is mapped to queue1
 
 ...
 
    yarn.scheduler.capacity.queue-mappings
    g:group1:queue2
    group1 is mapped to queue2
 
 ...
 
    yarn.scheduler.capacity.queue-mappings
    u:user1:queue1,u:user2:queue2
    Here,  is mapped to ,  is mapped to  respectively
 

  
    yarn.scheduler.queue-placement-rules.app-name
    appName1:queue1,%application:%application
    
      Here,  is mapped to , maps applications to queues with
      the same name as application respectively. The mappings will be
      evaluated from left to right, and the first valid mapping will be used.
    
  

应用程序的队列生存期

容量调度器支持以下参数的生命周期的应用程序

Property Description
yarn.scheduler.capacity..maximum-application-lifetime 提交到队列的应用程序的最大生存期(以秒为单位)。任何小于或等于零的值将被视为禁用。默认值是-1。如果配置为正值,则提交到该队列的任何应用程序将在超过配置的生存期后终止。用户还可以在应用程序提交上下文中指定每个应用程序的生命周期。但是,如果用户的生存期超过队列的最大生存期,那么用户的生存期将被覆盖。时间点配置。注意:此特性可以在队列层次结构的任何级别设置。子队列将继承它们的同级队列
yarn.scheduler.capacity.root..default-application-lifetime 提交到队列的应用程序的默认生存期(以秒为单位)。任何小于或等于零的值将被视为禁用。如果用户没有提交具有生命周期值的应用程序,那么该值将被取走。时间点配置。可以在队列层次结构的任何级别设置此特性。子队列将继承父队列的值,除非在子级别被重写。如果设置为小于或等于0,队列的最大值也必须是无限的。默认生存期不能超过最大生存期。

设置应用程序优先级

应用程序优先级只与 FIFO 排序策略一起工作。默认的排序策略是 FIFO。应用程序的默认优先级可以是集群级和队列级。

  • Cluster-level priority : 任何优先级大于集群最大优先级的提交应用程序的优先级将被重置为集群最大优先级。$HADOOP_HOME/etc/hadoop/yarn-site.xml 是集群最大优先级的配置文件。
Property Description
yarn.cluster.max-application-priority 定义集群中的最大应用程序优先级。
  • Leaf Queue-level priority : 每个叶队列由管理员提供默认优先级。队列的默认优先级将用于提交的任何没有指定优先级的应用程序。xml是队列级优先级的配置文件。
Property Description
yarn.scheduler.capacity.root..default-application-priority 定义叶队列中的默认应用程序优先级。

注意:当应用程序移动到不同队列时,应用程序的优先级不会改变。

容量调度程序容器抢占

容量调度器支持从资源使用超过其保证容量的队列中抢占容器。为了支持应用程序容器的抢占,需要在 yarn-site.xml 中启用以下配置参数。

Property Description
yarn.resourcemanager.scheduler.monitor.enable 启用一组影响调度器的定期监视器(在yarn.resourcemanager.scheduler.monitor.policies中指定)。默认值为false。
yarn.resourcemanager.scheduler.monitor.policies 与调度器交互的SchedulingEditPolicy类列表。配置的策略需要与调度器兼容。默认值为org.apache.hadoop. beans .server.resourcemanager.monitor.capacity。与容量调度器兼容的比例容量抢占策略

当为yarn.resourcemanager.scheduler.monitor.policies配置了proporalcapacitypreemptionpolicy类时,可以在yarn-site.xml中配置以下配置参数来控制容器的抢占

Property Description
yarn.resourcemanager.monitor.capacity.preemption.observe_only 如果为真,则运行策略,但不影响使用抢占和杀死事件的集群。默认值为false
yarn.resourcemanager.monitor.capacity.preemption.monitoring_interval 调用该比例容量抢占策略之间的时间(毫秒)。Default value is 3000
yarn.resourcemanager.monitor.capacity.preemption.max_wait_before_kill 从应用程序请求抢占到终止容器之间的时间(毫秒)。Default value is 15000
yarn.resourcemanager.monitor.capacity.preemption.total_preemption_per_round 单个回合中被抢占的资源的最大百分比。通过控制这个值,可以控制容器从集群中回收的速度。在计算所需的总优先购买量之后,策略将其伸缩回这个限制内。Default value is 0.1
yarn.resourcemanager.monitor.capacity.preemption.max_ignored_over_capacity 超过被忽略的目标容量的最大资源量。这在目标容量周围定义了一个死区,它有助于防止在计算的目标平衡周围发生颠簸和振荡。较高的值会减慢到容量的时间,并且(缺少自然的。完成)它可能会阻止收敛到保证的容量。Default value is 0.1
yarn.resourcemanager.monitor.capacity.preemption.natural_termination_factor 给定一个计算的抢占目标,考虑容器自然过期并只抢占增量的这个百分比。这决定了几何收敛到死区(MAX_IGNORED_OVER_CAPACITY)的速度。例如,在5 * #WAIT_TIME_BEFORE_KILL范围内,如果终止因子为0.5,即使没有自然终止,也会回收将近95%的资源。Default value is 0.2

xml中的CapacityScheduler支持以下配置,以控制提交到队列的应用程序容器的抢占。

Property Description
yarn.scheduler.capacity..disable_preemption 可以将此配置设置为true,以选择性地禁用提交到给定队列的应用程序容器的抢占。此属性仅适用于通过配置yarn.resourcemanager.scheduler.monitor启用系统范围抢占的情况。启用为真和yarn.resourcemanager.scheduler.monitor。ProportionalCapacityPreemptionPolicy政策。如果未为队列设置此属性,则该属性值将从队列的父队列继承。Default value is false.
yarn.scheduler.capacity..intra-queue-preemption.disable_preemption 可以将此配置设置为true,以选择性地禁用提交到给定队列的应用程序容器的队列内抢占。此属性仅适用于通过配置yarn.resourcemanager.scheduler.monitor启用系统范围抢占的情况。使为真,yarn.resourcemanager.scheduler.monitor。策略成比例的容量抢占策略,和yarn.resourcemanager.monitor.capacity. preempty .intra-queue- preempty .enabled为真。如果未为队列设置此属性,则该属性值将从队列的父队列继承。Default value is false.

预订属性

预订管理和权限

CapacityScheduler 支持以下参数来控制预订的创建、删除、更新和列表。注意,任何用户都可以更新、删除或列出他们自己的预订。如果启用了预订acl但没有定义,那么每个人都可以访问。在下面的示例中,是队列名称。例如,要设置预留ACL来管理默认队列上的预订,请使用属性yarn.scheduler.capacity.root.default.acl_administer_reservations

Property Description
yarn.scheduler.capacity.root..acl_administer_reservations ACL,它控制谁可以管理对给定队列的保留。如果给定用户/组在给定队列上有必要的acl,或者他们可以提交、删除、更新和列出所有预订。如果未指定,则此属性的acl不会从父队列继承。
yarn.scheduler.capacity.root..acl_list_reservations ACL,它控制谁可以将预订列到给定队列中。如果给定用户/组在给定队列上有必要的acl,那么它们可以列出所有应用程序。如果未指定,则此属性的acl不会从父队列继承。
yarn.scheduler.capacity.root..acl_submit_reservations 控制谁可以向给定队列提交预订的ACL。如果给定用户/组在给定队列上有必要的acl,那么它们可以提交预订。如果未指定,则此属性的acl不会从父队列继承。

使用容量调度器配置预留系统

容量调度器支持预留系统,允许用户提前预留资源。应用程序可以在运行时通过在提交期间指定reservationId来请求保留的资源。可以在ReservationSystem的yarn-site.xml中配置以下配置参数。

Property Description
yarn.resourcemanager.reservation-system.enable 必选参数:在ResourceManager中启用ReservationSystem。布尔值的预期。默认值为false,即默认情况下不启用ReservationSystem。
yarn.resourcemanager.reservation-system.class 可选参数:ReservationSystem的类名。根据配置的Scheduler选择默认值,即如果配置了CapacityScheduler,则为CapacityReservationSystem。
yarn.resourcemanager.reservation-system.plan.follower 可选参数:在计时器上运行的PlanFollower的类名,并将CapacityScheduler与Plan同步,反之亦然。根据配置的Scheduler选择默认值,即如果配置了CapacityScheduler,则为CapacitySchedulerPlanFollower。
yarn.resourcemanager.reservation-system.planfollower.time-step 可选参数:PlanFollower定时器的毫秒频率。长期价值的预期。缺省值为1000。

预留系统与容量调度器队列层次集成,目前可以为任何叶队列配置。容量调度器支持以下参数来调优 reservation 系统:

Property Description
yarn.scheduler.capacity..reservable 必选参数:向ReservationSystem表示该队列的资源可供用户预留。布尔值的预期。默认值为false,即默认情况下LeafQueues中不启用预订。
yarn.scheduler.capacity..reservation-agent 可选参数:用于确定ReservationAgent实现的类名,ReservationAgent将尝试将用户的预订请求放置在Plan中。默认值为:org.apache.hadoop.yarn.server.resourcemanager.reservation.planning.AlignedPlannerWithGreedy。
yarn.scheduler.capacity..reservation-move-on-expiry 可选参数,向ReservationSystem指定当关联的预留过期时,应用程序是否应该移动或终止到父预留队列(上面配置)。布尔值的预期。默认值为true,指示应用程序将被移动到可保留队列。
yarn.scheduler.capacity..show-reservations-as-queues 可选参数,用于在Scheduler UI中显示或隐藏预订队列。布尔值的预期。默认值为false,即保留队列将被隐藏。
yarn.scheduler.capacity..reservation-policy 可选参数:用于确定SharingPolicy实现的类名,该实现将验证新保留是否违反任何不变量。默认值:“org.apache.hadoop.yarn.server.resourcemanager.reservation.CapacityOverTimePolicy”。
yarn.scheduler.capacity..reservation-window 可选参数,表示如果满足计划中的约束,SharingPolicy将验证的毫秒级时间。长期价值的预期。默认值为1天。
yarn.scheduler.capacity..instantaneous-max-capacity 可选参数:任何时候的最大容量百分比(%),作为一个浮动,SharingPolicy允许单个用户预留。默认值为1,即100%。
yarn.scheduler.capacity..average-capacity 可选参数:允许的平均容量,它将以百分比(%)在ReservationWindow上聚合,作为一个浮动,SharingPolicy允许单个用户预留。默认值为1,即100%。
yarn.scheduler.capacity..reservation-planner 可选参数:用于确定Planner实现的类名,如果Plan容量低于用户预留资源(由于计划维护或节点故障),则将调用Planner实现。默认值为:org.apache.hadoop.yarn.server.resourcemanager.reservation. planing . simplecapacityreplanner,它扫描Plan,并按照验收顺序(LIFO)的倒序贪婪地删除预留,直到预留资源在Plan容量内
yarn.scheduler.capacity..reservation-enforcement-window 可选参数,表示如果满足“计划”中的约束,规划器将验证其时间(以毫秒为单位)。长期价值的预期。缺省值为1小时。

动态自动创建和管理叶队列

CapacityScheduler支持在父队列下自动创建叶队列,父队列已配置为支持此特性。

通过队列映射设置动态自动创建的叶队列

capacity中列出的用户组队列映射。队列映射需要指定一个额外的父队列参数,以标识需要在哪个父队列下创建自动创建的叶队列。更多细节请参考上面基于用户或组的队列映射部分。请注意,如下面的动态叶队列创建和管理一节中所述,此类父队列还需要启用自动创建子队列

样例


   yarn.scheduler.capacity.queue-mappings
   u:user1:queue1,g:group1:queue2,u:user2:%primary_group,u:%user:parent1.%user
   
     Here, u:%user:parent1.%user mapping allows any  other than user1,
     user2 to be mapped to its own user specific leaf queue which
     will be auto-created under .
   
 

用于动态叶队列自动创建和管理的父队列配置

动态队列自动创建和管理特性与CapacityScheduler队列层次结构集成,可以为ParentQueue配置当前自动创建叶队列。这样的父队列不支持其他预先配置的队列与自动创建的队列共存。CapacityScheduler支持以下参数来启用自动创建队列

Property Description
yarn.scheduler.capacity..auto-create-child-queue.enabled 必选参数:指定父队列需要启用创建自动叶子队列的CapacityScheduler。布尔值的预期。默认值为false,即在ParentQueue中默认不启用创建自动叶子队列。
yarn.scheduler.capacity..auto-create-child-queue.management-policy Optional parameter: the class name that will be used to determine the implementation of the AutoCreatedQueueManagementPolicy which will manage leaf queues and their capacities dynamically under this parent queue. The default value is org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.queuemanagement.GuaranteedOrZeroCapacityOverTimePolicy. Users or groups might submit applications to the auto-created leaf queues for a limited time and stop using them. Hence there could be more number of leaf queues auto-created under the parent queue than its guaranteed capacity. The current policy implementation allots either configured or zero capacity on a best-effort basis based on availability of capacity on the parent queue and the application submission order across leaf queues.

使用CapacityScheduler配置自动创建的叶队列

已为自动创建叶队列启用的父队列支持为自动创建叶队列的自动配置配置模板参数。自动创建的队列支持除队列ACL、绝对资源配置之外的所有叶队列配置参数。队列acl当前从父队列继承,即在叶队列模板上不能配置它们

roperty Description
yarn.scheduler.capacity..leaf-queue-template.capacity Mandatory parameter: Specifies the minimum guaranteed capacity for the auto-created leaf queues. Currently Absolute Resource configurations are not supported on auto-created leaf queues
yarn.scheduler.capacity..leaf-queue-template. Optional parameter: For other queue parameters that can be configured on auto-created leaf queues like maximum-capacity, user-limit-factor, maximum-am-resource-percent … - Refer Queue Properties section

样例


   yarn.scheduler.capacity.root.parent1.auto-create-child-queue.enabled
   true
 
 
    yarn.scheduler.capacity.root.parent1.leaf-queue-template.capacity
    5
 
 
    yarn.scheduler.capacity.root.parent1.leaf-queue-template.maximum-capacity
    100
 
 
    yarn.scheduler.capacity.root.parent1.leaf-queue-template.user-limit-factor
    3.0
 
 
    yarn.scheduler.capacity.root.parent1.leaf-queue-template.ordering-policy
    fair
 
 
    yarn.scheduler.capacity.root.parent1.GPU.capacity
    50
 
 
     yarn.scheduler.capacity.root.parent1.accessible-node-labels
     GPU,SSD
   
 
     yarn.scheduler.capacity.root.parent1.leaf-queue-template.accessible-node-labels
     GPU
  
 
    yarn.scheduler.capacity.root.parent1.leaf-queue-template.accessible-node-labels.GPU.capacity
    5
 

为自动创建的队列管理调度编辑策略配置

管理员需要指定一个额外的org.apache. hadopo .server.resourcemanager.scheduler.capacity.QueueManagementDynamicEditPolicy将编辑策略作为逗号分隔的字符串调度到当前调度编辑策略列表中。策略配置。有关更多细节,请参阅上面的容量调度器容器抢占一节

Property Description
yarn.resourcemanager.monitor.capacity.queue-management.monitoring-interval 调用QueueManagementDynamicEditPolicy策略的间隔时间(以毫秒为单位)。缺省值是1500。

其它设置

资源计算

Property Description
yarn.scheduler.capacity.resource-calculator 用于比较调度器中的资源的ResourceCalculator实现。默认情况下,org.apache.hadoop.yarn. utir .resource. defaultresourcecalculator只使用Memory,而DominantResourceCalculator使用Dominant-resource来比较内存、CPU等多维资源。需要使用Java ResourceCalculator类名。

数据本地化

容量调度器利用延迟调度来满足任务局部性约束。局部性约束有3个级别:节点-本地、机架-本地和关闭开关。当局部性不能满足时,调度器会计算错过机会的次数,并等待这个计数达到一个阈值,然后再将局部性约束放宽到下一级。阈值可以在以下属性中配置:

Property Description
yarn.scheduler.capacity.node-locality-delay 在CapacityScheduler尝试调度机架本地容器之后,错过的调度机会数。通常,应该将此设置为集群中的节点数。默认情况下,每个机架的节点数约为40个。期望为正整数。
yarn.scheduler.capacity.rack-locality-additional-delay 在节点-位置-延迟的调度机会之上,额外错过的调度机会的数量,在此之后,CapacityScheduler会尝试调度关闭开关容器。默认情况下,该值设置为-1,在这种情况下,错过分配off-switch容器的机会的数量是根据公式L * C / N计算的,其中L是在资源请求中指定的位置(节点或机架)的数量,C是请求的容器数量,N是集群的大小。

注意,如果将 YARN 与文件系统分开部署,应该禁用该特性,因为局部性是没有意义的。这可以通过设置yarn.scheduler.capacity.node-locality-delay = -1来实现。在这种情况下,忽略请求的位置约束。

每个NodeManager心跳的容器分配

CapacityScheduler支持以下参数来控制可以在每个NodeManager heartbeat中分配多少个容器。

Property Description
yarn.scheduler.capacity.per-node-heartbeat.multiple-assignments-enabled

是否允许在一个NodeManager心跳中分配多个容器。默认值为true。

yarn.scheduler.capacity.per-node-heartbeat.maximum-container-assignments 如果multiassignments -enabled为true,则表示在一个NodeManager心跳中可以分配的最大容器数量。默认值是100,这将每个心跳的最大容器分配数量限制为100。将该值设置为-1将禁用此限制。
yarn.scheduler.capacity.per-node-heartbeat.maximum-offswitch-assignments 如果multiassignments -enabled为true,则在一个NodeManager心跳中可以分配的最大off-switch容器数量。默认为1,表示在一个心跳中只允许一个关闭开关分配。

检查容量调度器的配置

安装和配置完成后,您可以在从web-ui启动集群之后查看它。

  1. 按正常方式启动 yarn 集群。
  2. 打开 ResourceManager web ui
  3. 调度器web页面应该显示各个队列的资源使用情况。

更改队列配置

更改队列/调度器属性和添加/删除队列可以通过两种方式完成,通过文件或通过API。这种行为可以通过 yarn-site.xml中的 yarn.scheduler.configuration.store.class来改变。可能的值是file,它允许通过file修改属性;内存,允许通过API修改属性,但不会在重启时持久化更改;允许通过API修改属性,并将更改存储在后台存储中;zk,它允许通过API修改属性,并将更改存储在zookeeper支持存储中。默认值是file。

通过文件更改队列配置

要按文件编辑,需要编辑conf/capacity-scheduler.xml并运行yarn rmadmin -refreshQueues。

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

通过文件删除队列

步骤一:停止队列

在删除叶队列之前,该叶队列不应该有任何正在运行/挂起的应用程序,必须通过更改yarn.schedule .capacity..state来停止(=STOPPED)。在删除父队列之前,它的所有子队列不应该有任何正在运行/挂起的应用程序,并且必须被停止。父队列也需要停止。

步骤二:删除队列

从文件中删除队列配置,然后按照上面的描述运行refresh。

通过API更改队列配置

通过API进行编辑使用调度器配置的后台存储。要启用该功能,可以在yarn-site.xml中配置以下参数。

注意:该功能还处于测试阶段,可能会有变化。

Property Description
yarn.scheduler.configuration.store.class 要使用的后台存储类型,file/memory/leveldb/zk
yarn.scheduler.configuration.mutation.acl-policy.class 通过配置ACL策略,可以限制哪些用户可以修改哪些队列。默认值:“org.apache.hadoop.yarn.server.resourcemanager.scheduler”。DefaultConfigurationMutationACLPolicy,它只允许YARN管理员进行任何配置修改。另一个值为“org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacit .conf”。QueueAdminConfigurationMutationACLPolicy,它只允许在调用方是队列管理员的情况下修改队列。
yarn.scheduler.configuration.store.max-logs 如果使用了leveldb或zookeeper,配置更改会在后台存储中记录审计日志。此配置控制要存储的审计日志的最大数量,当超过最大数量时删除最旧的日志。默认是1000。
yarn.scheduler.configuration.leveldb-store.path 使用leveldb时配置存储的存放路径。默认值为${hadoop.tmp.dir}/yarn/system/confstore。
yarn.scheduler.configuration.leveldb-store.compaction-interval-secs 使用leveldb时,压缩配置存储的间隔,以秒为单位。缺省值为86400,即一天。
yarn.scheduler.configuration.zk-store.parent-path 使用zookeeper时,配置用的zookeeper根节点路径存放了相关信息。缺省值为/confstore。

注意:当通过yarn.scheduler.configuration.store.class启用调度器配置变更时,yarn rmadmin -refreshQueues将被禁用,也就是说,将不再可能通过文件更新配置。

你可能感兴趣的:(YARN,HDFS,yarn容量调度)