YARN 节点的优雅解除配置

概述

YARN 非常容易扩展:任何新的 NodeManager 都可以加入配置的 ResourceManager 并开始执行作业。但为了实现完全的弹性,我们需要一个解除配置流程,该流程有助于移除现有节点并缩小集群规模。

YARN 节点可以解除配置为 NORMAL 或 GRACEFUL。

YARN 节点的正常解除配置表示立即关闭。

YARN 节点的优雅解除配置是解除配置 NM 的机制,同时最大程度地减少对正在运行的应用程序的影响。一旦节点处于 DECOMMISSIONING 状态,RM 不会在其上调度新的容器,并将等待正在运行的容器和应用程序完成(或直到解除配置超时为止),然后再将节点转换为 DECOMMISSIONED。

快速入门

执行正常解除配置

  1. 启动 YARN 集群(包括 NodeManager 和 ResourceManager)
  2. 启动 yarn 作业(例如,使用 yarn jar...
  3. yarn.resourcemanager.nodes.exclude-path 属性添加到 yarn-site.xml(注意:无需重新启动 ResourceManager)
  4. 创建文本文件(位置在之前的步骤中定义),其中一行包含所选 NodeManager 的名称
  5. 调用 ./bin/yarn rmadmin -refreshNodes
  6. 结果:NodeManager 会立即退役

在下一部分中,我们将介绍一些更详细的用法(例如:使用优雅退役和超时)。

功能

根据排除/包含列表触发退役/重新启用

yarn rmadmin -refreshNodes [-g [timeout in seconds] -client|server] 通知 NodesListManager 检测并处理包含和排除主机更改。NodesListManager 从 yarn-site.xml 中通过 yarn.resourcemanager.nodes.exclude-path 配置指定的排除文件中加载排除的主机。(注意:在更改排除路径的情况下无需重新启动 RM,因为此配置将在每次 refreshNodes 命令中重新读取)

该文件的格式可以是纯文本或 XML,具体取决于文件的扩展名。只有 XML 格式支持每个节点的优雅退役超时。

NodesListManager 检查并比较资源管理器中 RMNodes 的状态和排除列表,并根据以下规则应用必要的操作

  • 重新启用不再被排除的 DECOMMISSIONED 或 DECOMMISSIONING 节点;
  • 优雅地退役尚未处于 DECOMMISSIONED 或 DECOMMISSIONING 状态的排除节点;
  • 如果未指定 -g 标志,则立即退役尚未处于 DECOMMISSIONED 状态的排除节点。

相应地,RECOMMISSION、GRACEFUL_DECOMMISSION 或 DECOMMISSION RMNodeEvent 将被发送到 RMNode。

每个节点的退役超时支持

为了通过单个或多个 refreshNodes 请求使用不同的超时灵活地优雅地退役节点,HostsFileReader 支持在排除主机文件中每个主机名(或 IP)后提供可选的超时值。

用于特定主机的有效退役超时基于以下优先级

在服务器端超时的情况下

  1. 如果在排除主机文件中指定,则使用特定主机的超时;
  2. 如果指定,则使用 yarn rmadmin -refreshNodes -g [timeout in seconds] -server|client 中的超时;
  3. 使用通过“yarn.resourcemanager.nodemanager-graceful-decommission-timeout-secs”配置指定的默认超时。

在客户端超时的情况下(见下文)

  1. 将仅使用由 -g 标志定义的命令行参数。

NodesListManager 决定要使用的有效超时时间,并将其设置为各个 RMNode。还可以通过 yarn rmadmin -refreshNodes -g [timeout in seconds] 命令动态调整超时时间。NodesListManager 将解析要使用的有效超时时间,并在需要时使用新超时时间更新 RMNode。超时时间的更改不会重置正在进行的停用,而只会影响对节点是否已达到停用超时的评估。

以下是在 xml 格式中的排除文件示例。

<?xml version="1.0"?>
<hosts>
  <host><name>host1</name></host>
  <host><name>host2</name><timeout>123</timeout></host>
  <host><name>host3</name><timeout>-1</timeout></host>
  <host><name>host4, host5,host6</name><timeout>1800</timeout></host>
</hosts>

如果排除文件的扩展名不是 xml,则使用标准的每行一个主机的格式,而不支持超时。

host1
host2
host3

注意:未来计划提供更多支持超时的文件格式。如果您有兴趣,请关注 YARN-5536

需要注意的是,超时时间不会保留。如果 RM 重新启动/故障转移,则该节点将立即停用。(关注 YARN-5464 以了解此行为的更改)。

客户端或服务器端超时

优雅停用的超时时间可以在服务器端或客户端进行跟踪。-client|server 指示超时跟踪应由客户端还是 ResourceManager 处理。客户端跟踪是阻塞的,而服务器端跟踪不是。

RMNode 处理停用事件

在收到 GRACEFUL_DECOMMISSION 事件后,RMNode 将保存指定的停用超时时间,更新优雅停用的指标并保留其原始总容量,然后转换到 DECOMMISSIONING 状态。

资源将在 DECOMMISSIONING RMNode 上动态且定期更新,以便调度程序不会在它们上调度新容器,因为没有可用资源。

自动且异步地跟踪停用节点状态

DecommissioningNodeWatcher 是 YARN 组件,在客户端/管理员发出优雅停用请求后,自动且异步地跟踪 DECOMMISSIONING 节点状态。NM 定期发送 RM 心跳,其中包含其最新的容器状态。DecommissioningNodeWatcher 跟踪所有 DECOMMISSIONING 节点上的心跳更新,以决定在节点上的所有正在运行的容器完成后,何时转换到 DECOMMISSIONED 状态,之后将告知 NodeManager 关闭。

在 MR 应用程序下,一个节点在完成所有容器后,仍可能在应用程序持续期间为还原程序提供其映射输出数据。YARN 平稳停用机制会保留此类 DECOMMISSIONING 节点,直到所有涉及的应用程序完成。然而,在长期运行的应用程序场景中,大量“空闲”节点可能长时间存在,这是不可取的。DecommissioningNodeWatcher 通过超时平衡此类问题,无论运行容器或应用程序如何,DECOMMISSIONING 节点都将在停用超时之前停用。如果正在运行的容器提前完成,它将继续等待应用程序完成,直到停用超时。当停用超时到达时,无论如何都将停用该节点。该节点将停用,并且所有者任务将根据需要重新安排。

所有停用节点的状态都会定期(每 20 秒)记录在资源管理器日志中。以下是停用节点的子状态

  • NONE — 节点不在 DECOMMISSIONING 状态。
  • WAIT_CONTAINER — 等待正在运行的容器完成。
  • WAIT_APP — 等待正在运行的应用程序完成(在所有容器完成后)
  • TIMEOUT — 超时等待容器或应用程序完成
  • READY — 无需等待,准备停用
  • DECOMMISSIONED — 节点已停用

配置

属性
yarn.resourcemanager.nodemanager-graceful-decommission-timeout-secs YARN 节点平稳停用的超时(秒)。这是在将 DECOMMISSIONING 节点转换为 DECOMMISSIONED 之前等待正在运行的容器和应用程序完成的最长时间。默认值为 3600 秒。负值(如 -1)将作为无限超时处理。
yarn.resourcemanager.decommissioning-nodes-watcher.poll-interval-secs DecommissioningNodesWatcher 中轮询计时器任务的周期(秒),用于识别和处理缺少定期心跳的 DECOMMISSIONING 节点。默认值为 20 秒。
yarn.resourcemanager.nodes.exclude-path 要排除的节点的文件路径。
yarn.resourcemanager.nodes.include-path 要包含的节点的文件路径。