Hadoop Capacity Scheduler 调度用法官网权威示例详解

本文详细介绍了Hadoop中的Capacity Scheduler调度器,它允许多租户共享集群资源。阐述了其设计目标、功能,如分层队列、容量保证等,还说明了配置方法,包括队列设置、属性配置等,以及容器抢占、预留属性等内容,最后介绍了活动信息查看和配置更改方式。

Hadoop Capacity Scheduler 调度用法官网权威示例详解:

目的

本文档介绍了CapacityScheduler,它是Hadoop中的一种可插拔调度器,允许多个租户在分配容量的约束条件下及时地共享一个大型集群来分配资源。

概述

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

传统上,每个组织都有自己的专用计算资源,这些资源具有足够的容量以满足组织在峰值或接近峰值条件下的SLA。这通常导致平均利用率较低,并且管理多个独立集群的开销很高,每个组织一个集群。在组织之间共享集群是运行大型Hadoop安装的一种经济有效的方式,因为这使得它们能够在不创建私有集群的情况下获得规模经济效益的好处。但是,组织担心共享集群,因为他们担心其他人使用对他们的SLA至关重要的资源。

CapacityScheduler的设计目标是允许在给每个组织提供容量保证的同时共享一个大型集群。其核心思想是将Hadoop集群中的可用资源共享给多个共同资助集群的组织,这些组织根据自己的计算需求进行资助。另一个好处是组织可以访问其他人未使用的任何额外容量。这以一种经济高效的方式为组织提供了弹性。

在组织之间共享集群需要对多租户的强大支持,因为每个组织必须得到容量保证,并确保共享集群对于单个错误应用程序、用户或者多个应用程序、用户而言是安全的。CapacityScheduler提供了一系列严格的限制,以确保单个应用程序、用户或队列无法在集群中消耗不成比例的资源量。此外,CapacityScheduler对来自单个用户和队列的初始化和挂起的应用程序设置了限制,以确保集群的公平性和稳定性。

CapacityScheduler提供的主要抽象是队列的概念。这些队列通常由管理员设置,以反映共享集群的经济情况。

为了进一步控制和预测资源的共享,CapacityScheduler支持分层队列,以确保资源在组织的子队列之间共享,然后允许其他队列使用空闲资源,从而为给定组织的应用程序共享空闲资源提供亲和性。

功能

CapacityScheduler支持以下功能:

  • 分层队列:支持队列之间的层次结构,以确保在其他队列被允许使用空闲资源之前,组织的子队列之间共享资源,从而提供更多的控制和可预测性。
  • 容量保证:为队列分配一定比例(百分比)或绝对资源队列的最小容量。所有提交到队列的应用程序都可以访问队列分配的容量。管理员可以为每个队列配置软限制和可选的硬限制。
  • 安全性:每个队列都有严格的ACL(访问控制列表),控制谁可以向单个队列提交应用程序。此外,还有安全措施,以确保用户无法查看和/或修改其他用户的应用程序。还支持队列级别和系统管理员角色。
  • 弹性:可以将空闲资源分配给超过其容量的任何队列。当未来某个时间点上运行低于容量的队列上的任务完成时,如果这些资源需要来自该队列的需求,则会将它们分配给运行低于容量的队列上的应用程序(也支持抢占)。这样可以以可预测和弹性的方式为队列提供资源,从而防止集群中的人为资源隔离。
  • 多租户:提供了一套全面的限制,以防止单个应用程序、用户和队列垄断队列或整个集群的资源,以确保集群不会被压垮。
  • 可操作性
    • 运行时配置:管理员可以在运行时以安全的方式更改队列定义和属性,以最小化对用户的干扰。还提供了一个控制台供用户和管理员查看系统中各个队列当前分配的资源。管理员可以在运行时添加其他队列,但除非队列处于STOPPED状态且没有待处理/运行中的应用程序,否则不能在运行时删除队列。
    • 应用程序排空:管理员可以在运行时停止队列,以确保现有的应用程序运行完成后,无法提交新的应用程序。如果队列处于STOPPED状态,则无法将新的应用程序提交给其自身或任何子队列。现有的应用程序继续运行,因此队列可以优雅地排空。管理员还可以启动已停止的队列。
  • 基于资源的调度:支持资源密集型应用程序,其中应用程序可以选择指定比默认值更高的资源要求,从而适应具有不同资源要求的应用程序。目前,只支持内存资源要求。
  • 基于默认规则或用户定义规则的队列映射接口:此功能允许用户根据一些默认放置规则将作业映射到特定队列。例如,基于用户和组,或者基于应用程序名称。用户还可以定义自己的放置规则。
  • 优先级调度:此功能允许提交和调度具有不同优先级的应用程序。较高的整数值表示较高的优先级。目前,仅支持FIFO排序策略的应用程序优先级。

配置

配置ResourceManager使用CapacityScheduler

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

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

设置队列

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

CapacityScheduler有一个预定义的根队列(root)。系统中的所有队列都是根队列的子队列。

可以通过配置yarn.scheduler.capacity.root.queues属性以逗号分隔的子队列列表来设置更多的队列。

CapacityScheduler的配置使用了称为队列路径的概念来配置队列的层次结构。队列路径是队列层次结构的完整路径,从根队列开始,以点(.)作为分隔符。

可以使用配置参数yarn.scheduler.capacity..queues来定义给定队列的子队列。子队列不会直接从父队列继承属性,除非另有说明。

以下是一个示例,其中有三个顶级子队列a、b和c,以及a和b的一些子队列:

<property>
  <name>yarn.scheduler.capacity.root.queues</name>
  <value>a,b,c</value>
  <description>The queues at 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 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 this level (root is the root queue).</description>
</property>

队列属性

资源分配

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

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

CapacityScheduler支持使用绝对资源配置而不是以百分比提供队列容量。如上所述,对于yarn.scheduler.capacity.<queue-path>.capacityyarn.scheduler.capacity.<queue-path>.max-capacity的配置,管理员可以指定一个绝对资源值,例如[内存=10240,虚拟内核数=12]。这是有效的配置,表示10GB内存和12个VCores。

运行和挂起应用程序限制

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

Property Description
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 集群中可用于运行应用程序主节点的资源百分比的最大值 - 控制并发活动应用程序的数量。每个队列的限制与其队列容量和用户限制成比例。以浮点数形式指定,例如0.5 = 50%。默认值为10%。可以使用yarn.scheduler.capacity.maximum-am-resource-percent为所有队列设置,也可以通过设置yarn.scheduler.capacity.<queue-path>.maximum-am-resource-percent来覆盖每个队列的设置。
yarn.scheduler.capacity.max-parallel-apps / yarn.scheduler.capacity.<queue-path>.max-parallel-apps 可以同时运行的最大应用程序数。与maximum-applications不同,当达到此限制时,不会拒绝应用程序提交。相反,它们保持在ACCEPTED状态,直到有资格运行为止。可以使用yarn.scheduler.capacity.max-parallel-apps为所有队列设置,也可以通过设置yarn.scheduler.capacity.<queue-path>.max-parallel-apps来覆盖每个队列的设置。期望整数值。默认情况下,没有限制。最大并行应用程序限制是队列层次结构中的继承属性,这意味着将选择最低值作为在层次结构的每个分支中强制执行的限制。
yarn.scheduler.capacity.user.max-parallel-apps 所有用户可以同时运行的最大应用程序数。默认值为无限制。
yarn.scheduler.capacity.user.<username>.max-parallel-apps 特定用户可以同时运行的最大应用程序数。这将覆盖全局设置。

这些限制的评估按以下顺序进行:

  1. maximum-applications检查 - 如果超过了限制,则立即拒绝提交。
  2. max-parallel-apps检查 - 接受提交,但应用程序不会转换为RUNNING状态。它保持在ACCEPTED状态,直到满足队列/用户限制。
  3. maximum-am-resource-percent检查 - 如果有太多的Application Masters在运行,则应用程序保持在ACCEPTED状态,直到有足够的空间。

队列管理和权限

CapacityScheduler支持以下参数来管理队列:

Property Description
yarn.scheduler.capacity.<queue-path>.state 队列的状态。可以是RUNNING或STOPPED之一。**如果队列处于STOPPED状态,则无法将新的应用程序提交给它自身或其任何子队列。因此,如果根队列处于STOPPED状态,则无法向整个集群提交应用程序。**现有的应用程序继续完成,因此队列可以平稳地排空。指定为枚举值。
yarn.scheduler.capacity.root.<queue-path>.acl_submit_applications 控制谁可以向给定队列提交应用程序的ACL。如果给定的用户/组在给定队列或层次结构中的任何一个父队列上具有必要的ACL,则可以提交应用程序。如果在此列表中的用户名前面加上波浪符(~),则实际用户的ACL将允许代理用户提交到队列。
yarn.scheduler.capacity.root.<queue-path>.acl_administer_queue 控制谁可以管理给定队列上的应用程序的ACL。如果给定的用户/组在给定队列或层次结构中的任何一个父队列上具有必要的ACL,则可以管理应用程序。如果在此列表中的用户名前面加上波浪符(~),则实际用户的ACL将允许代理用户管理队列上的应用程序。

注意:ACL的格式为user1,user2 space group1,group2。 表示任何人。 空格表示没有人。如果未指定,则根队列的默认值为

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

CapacityScheduler支持以下参数来基于用户、组、用户和组或应用程序名称进行队列映射。用户还可以定义自己的放置规则:

Property Description
yarn.scheduler.capacity.queue-mappings 此配置指定将用户或组映射到特定队列。您可以将单个用户或一组用户映射到队列。语法:[u or 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 此配置指定将应用程序名称映射到特定队列。您可以将单个应用程序或一组应用程序映射到队列。语法:[app_name]:[queue_name][,next_mapping]*。这里,app_name表示要进行映射的应用程序名称。queue_name表示要将应用程序映射到的队列名称。要将当前应用程序的名称作为app_name,请使用%application。
yarn.scheduler.capacity.queue-mappings-override.enable 此功能用于指定是否可以覆盖用户指定的队列。这是一个布尔值,默认值为false。

CapacityScheduler配置示例

以下示例涵盖了单个映射的配置。在存在多个映射并使用逗号分隔值的情况下,评估将从左到右进行,并且将使用第一个有效的映射。下面的示例顺序是基于运行时实际执行顺序记录的,在存在多个映射的情况下。

<property>
  <name>yarn.scheduler.capacity.queue-mappings</name>
  <value>u:%user:%primary_group.%user</value>
  <description>将用户映射到与用户名相同的队列,但父级队列名称应与用户的主要组相同</description>
</property>

<property>
  <name>yarn.scheduler.capacity.queue-mappings</name>
  <value>u:%user:%secondary_group.%user</value>
  <description>将用户映射到与用户名相同的队列,但父级队列名称应与用户的任何次要组相同</description>
</property>

<property>
  <name>yarn.scheduler.capacity.queue-mappings</name>
  <value>u:%user:%user</value>
  <description>将用户映射到与用户名相同的队列</description>
</property>

<property>
  <name>yarn.scheduler.capacity.queue-mappings</name>
  <value
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BigDataMLApplication

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值