YARN 非常容易扩展:任何新的 NodeManager 都可以加入配置的 ResourceManager 并开始执行作业。但为了实现完全的弹性,我们需要一个解除配置流程,该流程有助于移除现有节点并缩小集群规模。
YARN 节点可以解除配置为 NORMAL 或 GRACEFUL。
YARN 节点的正常解除配置表示立即关闭。
YARN 节点的优雅解除配置是解除配置 NM 的机制,同时最大程度地减少对正在运行的应用程序的影响。一旦节点处于 DECOMMISSIONING 状态,RM 不会在其上调度新的容器,并将等待正在运行的容器和应用程序完成(或直到解除配置超时为止),然后再将节点转换为 DECOMMISSIONED。
执行正常解除配置
yarn jar...
)yarn.resourcemanager.nodes.exclude-path
属性添加到 yarn-site.xml
(注意:无需重新启动 ResourceManager)./bin/yarn rmadmin -refreshNodes
在下一部分中,我们将介绍一些更详细的用法(例如:使用优雅退役和超时)。
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 的状态和排除列表,并根据以下规则应用必要的操作
-g
标志,则立即退役尚未处于 DECOMMISSIONED 状态的排除节点。相应地,RECOMMISSION、GRACEFUL_DECOMMISSION 或 DECOMMISSION RMNodeEvent 将被发送到 RMNode。
为了通过单个或多个 refreshNodes 请求使用不同的超时灵活地优雅地退役节点,HostsFileReader 支持在排除主机文件中每个主机名(或 IP)后提供可选的超时值。
用于特定主机的有效退役超时基于以下优先级
在服务器端超时的情况下
yarn rmadmin -refreshNodes -g [timeout in seconds] -server|client
中的超时;在客户端超时的情况下(见下文)
-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 处理。客户端跟踪是阻塞的,而服务器端跟踪不是。
在收到 GRACEFUL_DECOMMISSION 事件后,RMNode 将保存指定的停用超时时间,更新优雅停用的指标并保留其原始总容量,然后转换到 DECOMMISSIONING 状态。
资源将在 DECOMMISSIONING RMNode 上动态且定期更新,以便调度程序不会在它们上调度新容器,因为没有可用资源。
DecommissioningNodeWatcher 是 YARN 组件,在客户端/管理员发出优雅停用请求后,自动且异步地跟踪 DECOMMISSIONING 节点状态。NM 定期发送 RM 心跳,其中包含其最新的容器状态。DecommissioningNodeWatcher 跟踪所有 DECOMMISSIONING 节点上的心跳更新,以决定在节点上的所有正在运行的容器完成后,何时转换到 DECOMMISSIONED 状态,之后将告知 NodeManager 关闭。
在 MR 应用程序下,一个节点在完成所有容器后,仍可能在应用程序持续期间为还原程序提供其映射输出数据。YARN 平稳停用机制会保留此类 DECOMMISSIONING 节点,直到所有涉及的应用程序完成。然而,在长期运行的应用程序场景中,大量“空闲”节点可能长时间存在,这是不可取的。DecommissioningNodeWatcher 通过超时平衡此类问题,无论运行容器或应用程序如何,DECOMMISSIONING 节点都将在停用超时之前停用。如果正在运行的容器提前完成,它将继续等待应用程序完成,直到停用超时。当停用超时到达时,无论如何都将停用该节点。该节点将停用,并且所有者任务将根据需要重新安排。
所有停用节点的状态都会定期(每 20 秒)记录在资源管理器日志中。以下是停用节点的子状态
属性 | 值 |
---|---|
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 | 要包含的节点的文件路径。 |