这是CDP中Yarn使用系列中的一篇,之前的文章请参考<使用YARN Web UI和CLI>、<CDP 中配置Yarn的安全性>、<CDP的Yarn资源调度与管理>和<CDP中Yarn管理队列>。
您可以配置调度程序属性来定义所有队列的行为。所有父队列和子队列都继承使用调度程序属性设置的属性。
在 Cloudera Manager 中,您可以使用调度程序配置选项卡来配置调度程序属性。
- 在 Cloudera Manager 中,选择集群 > YARN 队列管理器 UI 服务。
- 在 YARN Queue Manager 窗口中,单击Scheduler Configuration选项卡。
- 在Scheduler Configuration窗口中,输入属性的值并单击Save。
设置全局最大应用优先级
您可以使用优先级调度以更高的优先级运行 YARN 应用程序,而不管集群中已经运行的其他应用程序如何。YARN 将更多资源分配给以更高优先级运行的应用程序,而不是那些以较低优先级运行的应用程序。优先级调度使您能够在提交时和运行时动态设置应用程序的优先级。
优先级调度仅适用于 FIFO(先进先出)排序策略。FIFO 是默认的容量调度程序排序策略。
要设置应用程序优先级(yarn.cluster.max-application-priority),请执行以下操作:
- 在 Cloudera Manager 中,选择集群 > YARN 队列管理器 UI 服务。图形队列层次结构显示在概览选项卡中。
- 单击调度程序配置选项卡。
- 在最大应用程序优先级文本框中输入优先级。
- 点击保存。
配置抢占
抢占允许较高优先级的应用程序抢占较低优先级的应用程序。
可能会发生这样的情况:队列具有保证级别的集群资源,但必须等待运行应用程序,因为其他队列正在使用所有可用资源。如果启用抢占,则优先级较高的应用程序不必等待,因为优先级较低的应用程序已占用可用容量。当您启用抢占 ( yarn.resourcemanager.scheduler.monitor.enable ) 时,服务不足的队列几乎可以立即开始声明其分配的集群资源,而无需等待其他队列的应用程序完成运行。
您可以使用优先级调度以更高的优先级运行 YARN 应用程序,而不管集群中已经运行的其他应用程序如何。有关更多信息,请参阅 设置全局最大应用程序优先级。
要在所有队列上配置队列抢占选项,请执行以下操作:
- 在 Cloudera Manager 中,选择Clusters > YARN Queue Manager UI服务。图形队列层次结构显示在概览 选项卡中。
- 单击调度程序配置选项卡。
- 选中启用监控策略复选框。
- 指定 org.apache.hadoop.yarn.server.resourcemanager.monitor.capacity.ProportionalCapacityPreemptionPolicy 作为监控策略文本框中使用的监控策略。
- 配置所需的抢占属性:
- 抢占:仅观察- 选中该复选框以运行策略,但不会影响具有抢占和终止事件的集群。
- 抢占:监控间隔 (ms) - 调用此策略之间的时间(以毫秒为单位)。将此值设置为较长的时间间隔会导致容量监视器的运行频率降低。
- Preemption: Maximum Wait Before Kill (ms) - 从应用程序请求抢占和终止容器之间的时间(以毫秒为单位)。将此设置为更高的值可使应用程序有更多时间响应抢占请求并优雅地释放容器。
- 抢占:每轮总资源- 在单轮中被抢占的最大资源百分比。您可以使用此值来限制从集群中回收容器的速度。在计算所需的总抢占后,策略将其缩放回此限制。
- Preemption: Over Capacity Tolerance - 为抢占而忽略的超出目标容量的最大资源量。默认值为 0.1,这意味着资源管理器仅在队列超出其保证容量 10% 时才开始抢占队列。这避免了资源轮换和积极抢占。
- Preemption: Maximum Termination Factor - 每个队列的每个周期被抢占的抢占目标容量的最大百分比。您可以增加此值以加快资源回收。
- 点击保存。
启用队列内抢占
队列内抢占防止队列中的资源不平衡。
队列内抢占有助于根据配置的用户限制或应用程序优先级在队列内有效分配资源。
要在所有队列上配置队列内抢占(yarn.resourcemanager.monitor.capacity.preemption.intra-queue-preemption.enabled),请执行以下操作:
- 在 Cloudera Manager 中,选择集群 > YARN 队列管理器 UI 服务。图形队列层次结构显示在概览选项卡中。
- 单击调度程序配置选项卡。
- 选中启用队列内抢占复选框。
设置全局应用限制
为避免由于无法管理的负载(由恶意用户或意外引起)导致系统崩溃,容量调度程序使您能够对并发活动(正在运行和待处理)应用程序的总数设置静态、可配置的限制任何时候。
您可以使用此配置属性设置最大应用程序限制 ( yarn.scheduler.capacity.maximum-applications )。默认值为 10,000。
- 在 Cloudera Manager 中,选择集群 > YARN 队列管理器 UI 服务。图形队列层次结构显示在概览选项卡中。
- 单击调度程序配置选项卡。
- 在最大应用程序 文本框中输入最大应用程序限制。
- 点击保存。
设置默认应用程序主资源限制
Application Master (AM) 资源限制,可用于设置专门分配给 Application Master 的集群资源的最大百分比。该属性的默认值为 10%,存在是为了避免跨应用程序死锁,其中集群中的重要资源完全被运行 ApplicationMaster 的容器占用。
最大 AM 资源限制 ( yarn.scheduler.capacity.maximum-am-resource-percent ) 属性还间接控制集群中并发运行的应用程序数量,每个队列限制为与其容量成比例的运行应用程序数量。
- 在 Cloudera Manager 中,选择集群 > YARN 队列管理器 UI 服务。图形队列层次结构显示在概览选项卡中。
- 单击调度程序配置选项卡。
- 在最大 AM 资源限制 文本框中输入最大 AM 资源限制。
- 点击保存。
启用异步调度程序
异步调度器将 CapacityScheduler 调度与节点心跳解耦。这显着改善了延迟。
要启用异步调度(yarn.scheduler.capacity.schedule-asynchronously.enable),请执行以下操作:
- 在 Cloudera Manager 中,选择集群 > YARN 队列管理器 UI 服务。图形队列层次结构显示在概览选项卡中。
- 单击调度程序配置选项卡。
- 选中启用异步调度程序复选框。
- 点击保存。
使用 Cloudera Manager 配置队列映射以使用来自应用程序标签的用户名
您可以将队列映射配置为使用应用程序标记中的用户名,而不是提交作业的代理用户。
当用户运行 Hive 查询时,HiveServer2 提交从最终用户而不是 Hive 用户映射的队列中的查询。例如,当用户alice以doAs=false模式提交 Hive 查询时,作业将作为hive用户在 YARN 中运行 。如果启用了基于应用程序标签的调度,则作业将根据用户alice的队列映射配置放置到目标队列中 。
有关队列映射配置的更多信息,请参阅管理放置规则。有关 Hive 访问的信息,请参阅Apache Hive文档。
- 在 Cloudera Manager 中,选择YARN服务。
- 单击配置选项卡。
- 搜索ResourceManager。在Scope的 Filters 窗格下,选择ResourceManager。
- 在yarn-site.xml 的ResourceManager 高级配置片段(安全阀)中添加以下内容:
- 启用该application-tag-based-placement属性以根据使用应用程序标签传递的用户 ID 启用应用程序放置。
名称:yarn.resourcemanager.application-tag-based-placement.enable
值:true
说明:设置为“true”以根据使用应用程序标签传递的用户 ID 启用应用程序放置。当它被启用时,它会检查 userid=<userId> 模式,如果找到,应用程序将被放入找到的用户的队列中,如果原始用户对传递的用户队列具有所需的权限。
-
- 在许可名单中添加可以使用基于应用程序标签的展示位置的用户列表。当提交的用户包含在许可名单中时,应用程序将被放置到yarn.scheduler.capacity.queue-mappings应用程序标签中为用户定义的属性中定义的队列中。如果没有定义用户,则将使用提交用户。
名称:yarn.resourcemanager.application-tag-based-placement.username.whitelist
值:
说明:如果启用了“yarn.resourcemanager.application-tag-based-placement.enable”,则逗号分隔的用户列表可以使用基于应用程序标签的放置。
- 重新启动ResourceManager服务以应用更改。
配置 NodeManager 心跳
您可以控制在每个 NodeManager 心跳中可以分配多少个容器。
要为所有队列配置 NodeManager 心跳,请执行以下操作:
- 在 Cloudera Manager 中,选择Clusters > YARN Queue Manager UI 服务。图形队列层次结构显示在概览选项卡中。
- 单击调度程序配置选项卡。
- 选中Enable Multiple Assignments Per Heartbeat复选框以允许在一个 NodeManager heartbeat 中进行多个容器分配。
- 配置以下 NodeManager 心跳属性:
- 每个心跳的最大容器分配- 在一个 NodeManager 心跳中可以分配的最大容器数。将此值设置为 -1 将禁用此限制。
- 每个心跳的最大关闭开关分配- 在一个 NodeManager 心跳中可以分配的最大关闭开关容器数。
- 点击保存。
配置数据本地化
容量调度器利用延迟调度来满足任务局部性约束。局部约束分为三个级别:节点本地、机架本地和关闭开关。当不能满足局部性时,调度器会计算错过的机会数量,并等待此计数达到阈值,然后再将局部性约束放宽到下一个级别。您可以使用Node Locality Delay ( yarn.scheduler.capacity.node-locality-delay ) 和Rack Locality Additional Delay ( yarn.scheduler.capacity.rack-locality-additional-delay ) 字段配置此阈值。
要配置数据局部性,请执行以下操作:
- 在 Cloudera Manager 中,选择Clusters > YARN Queue Manager UI 服务。图形队列层次结构显示在概览选项卡中。
- 单击调度程序配置选项卡。
- 在Node Locality Delay文本框中,输入可能错过的调度机会数。
容量调度程序仅在错过此数量的机会后才尝试调度机架本地容器。您必须确保此数量与集群中的节点数量相同。
- 在Rack Locality Additional Delay文本框中,输入错过的调度机会的数量,在 Node Locality Delay 之后,Capacity Scheduler 应尝试调度关闭开关容器。
值为 -1 表示根据公式L * C / N计算该值,其中L是资源请求中指定的位置(节点或机架)数量,C是请求的容器数量,N是集群的大小。
- 点击保存。
原文链接:https://docs.cloudera.com/cdp-private-cloud-base/latest/yarn-allocate-resources/topics/yarn-configure-scheduler-properties.html