一、Yarn有哪些调度器
在cdh中Yarn组件中查看配置如下:
可以看到Yarn有三种调度器,分别是FairScheduler、FifoScheduler、CapacityScheduler,它们都是Hadoop的一个可插入调度器。
cdh默认的调度器是FairScheduler,hadoop默认的调度器是CapacityScheduler(<Hadoop-Yarn-启动篇> 中有源码提到过)
此时会感觉FifoScheduler有些孤立,Hadoop官网也只有FairScheduler和CapacityScheduler的调度器说明,说明FifoScheduler调度器并不被推荐使用到生产环境
FifoScheduler是最简单也是最容易理解的调度器,也不需要任何配置,见名知意 first input first output 是一个先进先出队列,在进行资源分配的时候,按照队列中的应用顺序依次分配资源。如果要使用FifoScheduler,在yarn-site.xml文件中修改成如下即可:
<property>
<name>yarn.resourcemanager.scheduler.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fifo.FifoScheduler</value>
</property>
二、官方对调度器的说明
1、CapacityScheduler
概述
CapacityScheduler旨在允许共享一个大型集群,同时为每个组织提供容量保证。核心思想是Hadoop集群中的可用资源在多个组织之间共享,这些组织根据其计算需求共同为集群提供资金。还有一个额外的好处,即一个组织可以访问其他组织未使用的任何多余容量。这以成本效益高的方式为各组织提供了弹性。
跨组织共享集群需要对多租户提供强有力的支持,因为每个组织都必须有保证的容量和安全保护,以确保共享集群不受单个恶意应用程序或用户或其集合的影响。CapacityScheduler提供了一组严格的限制,以确保单个应用程序、用户或队列不会消耗集群中不成比例的资源。此外,CapacityScheduler对来自单个用户和队列的初始化和挂起的应用程序提供了限制,以确保集群的公平性和稳定性。
CapacityScheduler提供的主要抽象是队列的概念。这些队列通常由管理员设置,以反映共享集群的经济性。
为了提供对资源共享的进一步控制和可预测性,CapacityScheduler支持分层队列,以确保在允许其他队列使用空闲资源之前,在组织的子队列之间共享资源,从而提供在给定组织的应用程序之间共享空闲资源的亲和力。
特征
CapacityScheduler支持以下功能:
Hierarchical Queues 队列分层
支持队列层次结构,以确保在允许其他队列使用空闲资源之前,在组织的子队列之间共享资源,从而提供更多的控制和可预测性。
Capacity Guarantees 容量保证
队列被分配为网格容量的一小部分,队列自己支配一定容量的资源。提交到队列的所有应用程序都可以访问分配给队列的容量。管理员可以对分配给每个队列的容量配置软限制和可选的硬限制。
Security 安全
每个队列都有严格的ACL,用于控制哪些用户可以向各个队列提交应用程序。此外,还提供了安全保护,以确保用户无法查看和/或修改其他用户的应用程序。
Elasticity 弹性
空闲资源可以分配给超出其容量的任何队列。当在未来某个时间点运行低于容量的队列对这些资源有需求时,随着在这些资源上调度的任务完成,这些资源将分配给运行低于容量队列上的应用程序(也支持抢占)。这确保了资源以可预测和弹性的方式可用于队列,从而防止集群中人为的资源孤岛。
Multi-tenancy 多租户技术
提供了一组全面的限制,以防止单个应用程序、用户和队列独占队列或整个集群的资源,从而确保集群不会不堪重负。
Operability 可操作性
Runtime Configuration 运行时配置
管理员可以在运行时以安全的方式更改队列定义和属性(如容量、ACL),以最大限度地减少对用户的干扰。此外,还为用户和管理员提供了一个控制台,用于查看系统中各种队列的当前资源分配情况。管理员可以在运行时添加其他队列,但除非队列已停止并且没有挂起/正在运行的应用程序,否则无法在运行时删除队列。
Drain applications 排出应用
管理员可以在运行时停止队列,以确保在现有应用程序运行到完成时,不会提交新的应用程序。如果队列处于STOPPED状态,则无法向其自身或其任何子队列提交新的应用程序。现有的应用程序继续完成,因此队列可以正常地排出。管理员还可以启动停止的队列。
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使用CapacityScheduler
Hadoop的默认配置,在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的预定义队列。系统中的所有队列都是root队列的子队列。
可以通过使用逗号分隔的子队列列表配置yarn.scheduler.ccapacity.roots.queues来设置更多的队列。
CapacityScheduler的配置使用一个称为队列路径的概念来配置队列的层次结构。队列路径是队列层次结构的完整路径,从根开始,使用.(点)作为分隔符。
以下是一个示例,其中包含三个顶级子队列a、b和c以及a和b的一些子队列:
<property>
<name>yarn.scheduler.capacity.root.queues</name>
<value>a,b,c</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.a.queues</name>
<value>a1,a2</value>
</property>
<property>
<name>yarn.scheduler.capacity.root.b.queues</name>
<value>b1,b2,b3</value>
</property>
队列属性
资源分配
yarn.scheduler.capacity.<queue-path>.capacity
yarn.scheduler.capacity.<queue-path>.maximum-capacity
yarn.scheduler.capacity.<queue-path>.minimum-user-limit-percent
yarn.scheduler.capacity.<queue-path>.user-limit-factor
yarn.scheduler.capacity.<queue-path>.maximum-allocation-mb
yarn.scheduler.capacity.<queue-path>.maximum-allocation-vcores
yarn.scheduler.capacity.<queue-path>.user-settings.<user-name>.weight
使用绝对资源配置的资源分配
CapacityScheduler支持配置绝对资源,而不是以百分比形式提供队列容量。管理员可以指定一个绝对资源值,如[memory=10240,vcores=12]。这是一个有效的配置,表示10GB内存和12个VCores。
正在运行和挂起的应用程序限制
CapacityScheduler支持以下参数来控制正在运行和挂起的应用程序
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
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、最大应用程序检查-如果超过限制,提交将立即被拒绝。
2、最大并行应用程序检查-接受提交,但应用程序不会转换到RUNNING状态。它将保持在ACCEPTED(接受)状态,直到满足队列/用户限制为止。
3、最大am资源百分比检查-如果运行的应用程序主机太多,则应用程序将保持在ACCEPTED状态,直到有足够的空间为止。
队列管理和权限
CapacityScheduler支持以下参数来管理队列
yarn.scheduler.capacity.<queue-path>.state
yarn.scheduler.capacity.root.<queue-path>.acl_submit_applications
yarn.scheduler.capacity.root.<queue-path>.acl_administer_queue
注意:ACL的形式为user1,user2 space group1,group2。*的特殊值意味着任何人。空间的特殊价值并不意味着任何人。如果未指定,则根队列的默认值为*。
基于用户或组、应用程序名称或用户定义的放置规则的队列映射
CapacityScheduler支持以下参数,以根据用户或组、用户和组或应用程序名称配置队列映射。用户还可以定义自己的放置规则:
yarn.scheduler.capacity.queue-mappings
yarn.scheduler.queue-placement-rules.app-name
yarn.scheduler.capacity.queue-mappings-override.enable
应用程序的队列生存期
CapacityScheduler支持以下应用程序寿命参数:
yarn.scheduler.capacity.<queue-path>.maximum-application-lifetime
yarn.scheduler.capacity.root.<queue-path>.default-application-lifetime
应用程序优先级的设置
应用程序优先级仅适用于FIFO排序策略。默认订购策略为FIFO
应用程序的默认优先级可以是集群级别和队列级别
集群级优先级
任何提交的优先级高于集群最高优先级的应用程序的优先级都将重置为集群最高优先级
可在yarn-site.xml中配置yarn.cluster.max-application-priority
叶队列级别优先级
每个叶队列都由管理员提供默认优先级。队列的默认优先级将用于任何提交的没有指定优先级的应用程序
可以在$HADOOP_HOME/etc/HADOOP/caccepty-scheduler.xml中配置以下属性
yarn.scheduler.capacity.root.<leaf-queue-path>.default-application-priority
容器抢占
CapacityScheduler支持从资源使用量超过其保证容量的队列中抢占容器。为了支持应用程序容器的抢占,需要在yarn-site.xml中启用以下配置参数
yarn.resourcemanager.scheduler.monitor.enable
yarn.resourcemanager.scheduler.monitor.policies
CapacityScheduler.xml中以下配置,可以控制提交到队列的应用程序容器的抢占。
yarn.scheduler.capacity.<queue-path>.disable_preemption
yarn.scheduler.capacity.<queue-path>.intra-queue-preemption.disable_preemption
预订属性
CapacityScheduler支持以下参数来控制预订的创建、删除、更新和列出。请注意,任何用户都可以更新、删除或列出自己的预订。
如果已启用但未定义保留ACL,则每个人都可以访问。
相关属性如下:(<queue>是队列名称)
yarn.scheduler.capacity.root.<queue>.acl_administer_reservations
yarn.scheduler.capacity.root.<queue>.acl_list_reservations
yarn.scheduler.capacity.root.<queue>.acl_submit_reservations
配置ReserveSystem
CapacityScheduler支持预留系统,允许用户提前预留资源。应用程序可以在运行时通过在提交过程中指定reservationId来请求保留的资源。
叶队列的动态自动创建和管理
CapacityScheduler支持在已配置为启用此功能的父队列下自动创建叶队列,并可以为自动创建的队列管理安排编辑策略配置。
其他特性
资源计算器
yarn.scheduler.capacity.resource-calculator
解释:用于比较调度程序中的资源的ResourceCalculator实现。默认值,即org.apache.hadoop.yarn.util.resource.DefaultResourceCalculator 仅使用内存,而显性资源计算器使用显性资源来比较内存、CPU等多维资源。需要Java资源计算器类名。
数据局部性
Capacity Scheduler利用Delay Scheduling来满足任务位置限制。局部约束有三个级别:节点局部、机架局部和关闭开关。
当不能满足局部性时,调度器统计错过的机会的数量,并等待该计数达到阈值,然后将局部性约束放宽到下一级别。可以在以下属性中配置阈值:
yarn.scheduler.capacity.node-locality-delay
解释:CapacityScheduler尝试调度机架本地容器后错过的调度机会数。通常,这应该设置为集群中的节点数。默认情况下,在一个机架中设置大约40个节点。应为正整数值。
yarn.scheduler.capacity.rack-locality-additional-delay
解释:与节点位置延迟相比,额外错过的调度机会的数量,之后CapacityScheduler尝试调度交换机外的容器。默认情况下,此值设置为-1,在这种情况下,分配断开容器的错过机会的数量是基于公式L*C/N计算的,其中
L是资源请求中指定的位置(节点或机架)的数量
C是请求的容器的数量
N是集群的大小
请注意,如果YARN与文件系统分开部署,则应禁用此功能,因为位置性毫无意义。这可以通过将yarn.sscheduler.capacity.node-locality-deplay设置为-1来完成,在这种情况下,将忽略请求的局部性约束。
每个NodeManager心跳的容器分配
CapacityScheduler支持以下参数来控制每个NodeManager心跳中可以分配多少容器。这些参数可通过yarn rmadmin-refreshQueues进行刷新。
yarn.scheduler.capacity.per-node-heartbeat.multiple-assignments-enabled
解释:是否允许在一个NodeManager检测信号中分配多个容器。默认为true。
yarn.scheduler.capacity.per-node-heartbeat.maximum-container-assignments
解释:如果启用了多个分配,则为一个NodeManager检测信号中可以分配的容器的最大数量。默认值为100,将此值设置为-1将禁用此限制。
yarn.scheduler.capacity.per-node-heartbeat.maximum-offswitch-assignments
解释:如果启用了多个分配,则为一个NodeManager检测信号中可以分配的最大断开容器数。默认值为1,表示在一个检测信号中只允许一个关闭开关分配。
查看CapacityScheduler的配置
以正常方式启动YARN集群,打开ResourceManager web UI会显示各个队列的资源使用情况
更改队列配置
更改队列/调度程序属性和添加/删除队列可以通过两种方式完成,即文件或API。
可以通过yarn-site.xml中的yarn.scheduler.configuration.store.class进行设置,默认file
解释:用于计划程序配置的配置存储的类型。默认值为"file",它使用基于文件的capacity-shuler.xml来检索和更改调度器配置。要启用基于API的调度程序配置,请使用"内存"(在内存存储中,在重新启动时没有持久性)、"leveldb"(基于leveldb的存储)或"zk"(基于zookeeper的存储)。只有当使用支持可变配置的调度程序时,基于API的配置才有用。目前只有容量调度程序支持此功能。
文件
要按文件进行编辑,需要编辑conf/capacityscheduler.xml并运行yarn rmadmin-refreshQueues
$ vi $HADOOP_CONF_DIR/capacity-scheduler.xml
$ $HADOOP_YARN_HOME/bin/yarn rmadmin -refreshQueues
通过文件删除队列
1、停止队列
在删除叶队列之前,叶队列不应具有任何正在运行/挂起的应用程序,并且必须通过更改yarn.scheduler.caccept.<queue-path>.state来停止。在删除父队列之前,其所有子队列不应具有任何正在运行/挂起的应用程序,并且必须停止。父队列也需要停止。
2、删除队列
从文件中删除队列配置并运行刷新
API
此功能处于Alpha阶段,可能会发生更改
补充:
Alpha :主要是以实现软件功能为主,超多bug
Beta:消除严重bug,但是还有缺陷,而且会有新功能加入
RC:(release.candidate):发行候选版,几乎就不会加入新的功能了,而是着重于除错
Stable版:稳定版
2、FairScheduler
介绍
公平调度是一种将资源分配给应用程序的方法,使所有应用程序在一段时间内平均获得相等的资源份额。
默认情况下,"公平调度程序"仅根据内存进行调度公平性决策。可以使用Ghodsi等人开发的显性资源公平概念,将其配置为同时使用内存和CPU进行调度。
当有一个应用程序运行时,该应用程序将使用整个集群。当提交其他应用程序时,释放的资源会分配给新的应用程序,这样每个应用程序最终都会获得大致相同的资源量。
与默认的Hadoop调度程序不同,它形成了一个应用程序队列,这可以让短应用程序在合理的时间内完成,而不会让长寿命的应用程序挨饿。这也是在多个用户之间共享集群的合理方式。
也可以与应用程序优先级一起使用,优先级被用作权重,以确定每个应用程序应该获得的总资源的比例。
调度器将应用程序进一步组织成"队列",并在这些队列之间公平地共享资源。默认情况下,所有用户共享一个名为"default"的队列。如果应用程序在容器资源请求中专门列出了一个队列,则该请求会提交到该队列。还可以通过配置根据请求中包含的用户名分配队列。
在每个队列中,调度策略用于在运行的应用程序之间共享资源。默认为基于内存的公平共享,但也可以配置FIFO和具有主导资源公平性的多资源。队列可以按层次结构排列以划分资源,并配置权重以按特定比例共享集群。
除了提供公平共享外,fair Scheduler还允许为队列分配有保证的最小共享,这有助于确保某些用户、组或生产应用程序始终获得足够的资源。
当队列包含应用程序时,它至少会获得其最小共享,但当队列不需要其完全保证的共享时,多余的部分会在其他运行的应用程序之间分配。这使调度程序能够保证队列的容量,同时在队列不包含应用程序时有效地利用资源。
Fair Scheduler默认情况下允许所有应用程序运行,但也可以通过配置文件限制每个用户和每个队列运行的应用程序的数量。当用户必须同时提交数百个应用程序时,这可能很有用,或者如果一次运行太多应用程序会导致创建太多中间数据或切换太多上下文,这通常会提高性能。限制应用程序不会导致任何后续提交的应用程序失败,只会在调度程序的队列中等待,直到用户的一些早期应用程序完成。
使用
要使用Fair Scheduler,请首先在yarn-site.xml中分配适当的调度器类:
<property>
<name>yarn.resourcemanager.scheduler.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value>
</property>
可插入策略的分层队列
公平调度程序支持分层队列。所有队列都是从一个名为"root"的队列派生而来的。可用资源以典型的公平调度方式分布在root队列的子队列中。然后,子队列以同样的方式将他们的资源分配给子队列。应用程序只能在叶队列上进行调度。通过将队列作为其父队列的子元素放置在公平调度程序分配文件中,可以将队列指定为其他队列的子队列。
队列的名称以其父队列的名称开头,以句点作为分隔符。因此,根队列下的名为"queue1"的队列将被称为"root.queue1",而名为"parent1"的队列下的"queue2"队列将被称作"root.parent1.queue2"。当提及队列时,名称的根部分是可选的,因此queue1可以被称为仅"queue1",而queue2可以被称作仅"parent1.queue2"。
此外,公平调度程序允许为每个队列设置不同的自定义策略,以允许以用户想要的任何方式共享队列的资源。可以通过扩展org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.SchedulingPolicy来构建自定义策略。FifoPolicy、FairSharePolicy(默认)和 DominantResourceFairnessPolicy 是内置的,可以直接使用。
自动将应用程序放入队列
Fair Scheduler允许管理员配置策略,自动将提交的应用程序放入适当的队列中。放置可能取决于提交者的用户和组以及应用程序传递的请求队列。策略由一组规则组成,这些规则按顺序应用以对传入的应用程序进行分类。每个规则要么将应用程序放入队列,要么拒绝它,要么继续执行下一个规则。
配置
自定义Fair Scheduler通常需要更改两个文件,即yarn-site.xml文件和自定义分配文件
yarn-site.xml
yarn.scheduler.fair.allocation.file
解释:分配文件的路径。分配文件是描述队列及其属性以及某些策略默认值的XML清单。此文件必须采用下一节中描述的XML格式。如果给定了相对路径,则会在类路径(通常包括Hadoop conf目录)上搜索该文件。默认为fair-scheduler.xml。
yarn.scheduler.fair.user-as-default-queue
解释:如果未指定队列名称,是否使用与分配关联的用户名作为默认队列名称。如果设置为"false"或未设置,则所有作业都有一个名为"default"的共享默认队列。默认为true。如果在分配文件中给定了队列放置策略,则会忽略此属性。
yarn.scheduler.fair.preemption
解释:是否使用抢占。默认为false。
yarn.scheduler.fair.preemption.cluster-utilization-threshold
解释:抢占开始后的利用率阈值。利用率计算为所有资源中使用率与容量的最大比率。默认值为0.8f。
yarn.scheduler.fair.sizebasedweight
解释:是否根据应用程序的大小为其分配共享,而不是为所有应用程序提供平等的共享(无论大小)。当设置为true时,应用程序的权重为1的自然对数加上应用程序请求的总内存,再除以2的自然对数。默认为false。
yarn.scheduler.fair.assignmultiple
解释:是否允许在一个检测信号中分配多个容器。默认为false。
yarn.scheduler.fair.dynamic.max.assign
解释:如果 assignmultiple 为true,则是否动态确定一个检测信号中可以分配的资源量。启用后,节点上大约一半未分配的资源在一个心跳中分配给容器。默认为true。
yarn.scheduler.fair.max.assign
解释:如果 assignmultiple 为true,dynamic.max.assign 为false,则表示一个检测信号中可以分配的容器的最大数量。默认值为-1,不设限制。
yarn.scheduler.fair.locality.threshold.node
解释:对于在特定节点上请求容器的应用程序,指自上次容器分配以来,在接受另一个节点上的放置之前等待的调度机会数。表示为0和1之间的浮动,这是集群大小的一小部分,是要错过的调度机会的数量。默认值-1.0表示不要错过任何日程安排机会。
yarn.scheduler.fair.locality.threshold.rack
解释:对于请求在特定机架上放置容器的应用程序,指自上次容器分配以来,在接受另一个机架上的放置之前等待的调度机会的数量。表示为0和1之间的浮动,这是集群大小的一小部分,是要错过的调度机会的数量。默认值-1.0表示不要错过任何日程安排机会。
yarn.scheduler.fair.allow-undeclared-pools
解释:如果是true,则可以在应用程序提交时创建新队列,无论是因为提交者将它们指定为应用程序的队列,还是因为用户将它们作为默认队列属性放置在那里。如果这是false,则任何时候应用程序都会被放置在分配文件中未指定的队列中,而是被放置在"默认"队列中。默认为true。如果在分配文件中给定了队列放置策略,则会忽略此属性。
yarn.scheduler.fair.update-interval-ms
解释:锁定调度程序并重新计算公平份额、重新计算需求以及检查是否有应优先购买的内容的间隔。默认为500毫秒。
yarn.resource-types.memory-mb.increment-allocation
解释:公平调度程序以该值为增量授予内存。如果您提交的任务的资源请求不是memory-mb.increment-allocation的倍数,则该请求将四舍五入到最接近的增量。默认值为1024 MB。
yarn.resource-types.vcores.increment-allocation
解释:fairscheduler以该值为增量授予vcore。如果您提交的任务的资源请求不是vcores.increment-allocation的倍数,则该请求将四舍五入到最接近的增量。默认值为1。
yarn.resource-types.<resource>.increment-allocation
解释:fairscheduler以该值的增量授予<resource>。如果您提交的任务的资源请求不是<resource>.inrement分配的倍数,则该请求将四舍五入到最接近的增量。如果未为资源指定此属性,则不会应用增量四舍五入。如果未指定单位,则假定为资源的默认单位。
yarn.scheduler.increment-allocation-mb
解释:内存的分配增量。不再是首选。请改用yarn.resource-types.memory-mb.increment-allocation。默认值为1024 MB。
yarn.scheduler.increment-allocation-vcores
解释:CPU vcores的分配增量。不再是首选。请改用yarn.resource-types.vcores.crement-allocation。默认值为1。
自定义分配文件
分配文件必须为XML格式。请注意,为了与原始FairScheduler向后兼容,"队列"元素可以改为命名为"池"元素。
队列访问控制列表
队列访问控制列表(ACL)允许管理员控制谁可以对特定队列执行操作。它们使用aclSubmitApps和aclAdministratorApps属性进行配置,这些属性可以按队列设置。目前唯一支持的管理操作是终止应用程序。
管理员也可以向其提交应用程序。这些属性的值的格式类似于"user1,user2 group1,group2" or " group1,group2。(分隔符是一个空格字符
如果用户/组是队列ACL的成员或队列的任何祖先的队列ACL的一员,则允许对该队列执行操作。因此,如果queue2在queue1内,user1在queue1的ACL中,user2在queue2的ACL中时,那么两个用户都可以提交给queue2。)
默认情况下,root 队列的ACL是"*",因为ACL是向下传递的,这意味着每个人都可以向每个队列提交并终止应用程序。要开始限制访问,请将根队列的ACL更改为"*"以外的内容。
预订访问控制列表
保留访问控制列表(ACL)允许管理员控制谁可以对特定队列执行保留操作。它们配置有aclAdministrativeReservations、aclListReservation和aclSubmitReserves属性,这些属性可以按队列设置。目前支持的管理操作是更新和删除预订。
管理员还可以提交并列出队列中的所有预订。这些属性的值的格式类似于"user1,user2 group1,group2" or " group1,group2"。如果用户/组是保留ACL的成员,则允许对队列执行操作。请注意,任何用户都可以更新、删除或列出自己的预订。如果已启用但未定义保留ACL,则每个人都可以访问。
配置ReserveSystem
Fair Scheduler支持ReservationSystem,该系统允许用户提前预订资源。应用程序可以在运行时通过在提交过程中指定reservationId来请求保留资源。可以在ReserveSystem的yarn-site.xml中配置以下配置参数。
yarn.resourcemanager.reservation-system.enable
解释:必选参数:启用ResourceManager中的ReserveSystem。应为布尔值。默认值为false,即默认情况下未启用ReserveSystem。
yarn.resourcemanager.reservation-system.class
解释:可选参数:ReserveSystem的类名。默认值是根据配置的Scheduler选择的,即如果配置了FairScheduler,则为 FairReserveSystem。
yarn.resourcemanager.reservation-system.plan.follower
解释:可选参数:PlanFollower 的类名,它在计时器上运行,并将FairScheduler与Plan同步,反之亦然。默认值是根据配置的Scheduler选择的,即如果配置了FairScheduler,则它是 FairSchedulerPlanFollower。
yarn.resourcemanager.reservation-system.planfollower.time-step
解释:可选参数:PlanFollower计时器的频率(以毫秒为单位)。应为长值。默认值为1000。
管理
运行时修改配置
通过编辑分配文件,可以在运行时修改最小共享、限制、权重、抢占超时和队列调度策略。调度程序将在看到该文件被修改后10-15秒重新加载该文件。
web UI监控
当前的应用程序、队列和公平共享可以通过ResourceManager的web界面进行检查
队列之间移动应用程序
Fair Scheduler支持将正在运行的应用程序移动到其他队列。这对于将重要的应用程序移动到优先级较高的队列或将不重要的应用软件移动到优先级较低的队列非常有用。可以通过运行yarn application-movetoqueue appID-queue targetQueueName来移动应用程序。
当应用程序移动到队列时,为了确定公平性,它的现有分配将与新队列的分配一起计算,而不是与旧队列的分配。如果将应用程序的资源添加到队列中会违反其maxRunningApps或maxResources约束,则将应用程序移动到队列的尝试将失败。
转储 Fair Scheduler 状态
Fair Scheduler能够定期转储其状态。默认情况下,它处于禁用状态。管理员可以通过将org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler.statedump日志记录级别设置为DEBUG来启用它。
Fair Scheduler日志默认情况下会转到Resource Manager日志文件。Fair Scheduler状态转储可能会生成大量日志数据。
取消注释log4j.properties中的"Fair scheduler state dump"部分,将状态转储到一个单独的文件中。