NodeManager 负责在节点上启动和管理容器。容器根据 AppMaster 的指定执行任务。
NodeManager 运行服务来确定其执行节点的运行状况。这些服务对磁盘执行检查,并执行任何用户指定的测试。如果任何运行状况检查失败,NodeManager 会将该节点标记为不健康,并将其传达给 ResourceManager,后者随后停止向该节点分配容器。节点状态的通信作为 NodeManager 和 ResourceManager 之间心跳的一部分进行。磁盘检查器和运行状况监视器(如下所述)运行的间隔不会影响心跳间隔。当心跳发生时,两个检查的状态都用于确定节点的运行状况。
磁盘检查器检查 NodeManager 配置为使用的磁盘的状态(local-dirs 和 log-dirs,分别使用 yarn.nodemanager.local-dirs 和 yarn.nodemanager.log-dirs 配置)。检查包括权限和可用磁盘空间。它还检查文件系统是否处于只读状态。默认情况下,检查每 2 分钟运行一次,但可以根据用户的需要配置为更频繁地运行。如果磁盘检查失败,NodeManager 将停止使用该特定磁盘,但仍会报告节点状态为健康。但是,如果多个磁盘检查失败(该数字可以配置,如下所述),则该节点将向 ResourceManager 报告为不健康,并且不会向该节点分配新的容器。
可以使用以下配置参数修改磁盘检查
配置名称 | 允许的值 | 说明 |
---|---|---|
yarn.nodemanager.disk-health-checker.enable |
true、false | 启用或禁用磁盘健康检查器服务 |
yarn.nodemanager.disk-health-checker.interval-ms |
正整数 | 磁盘检查器运行的时间间隔(以毫秒为单位);默认值为 2 分钟 |
yarn.nodemanager.disk-health-checker.min-healthy-disks |
0-1 之间的浮点数 | 必须通过检查的磁盘最小分数,以便 NodeManager 将节点标记为健康;默认值为 0.25 |
yarn.nodemanager.disk-health-checker.max-disk-utilization-per-disk-percentage |
0-100 之间的浮点数 | 磁盘检查器服务将磁盘标记为不健康之前,可以利用的最大磁盘空间百分比。此检查将针对 NodeManager 使用的每个磁盘运行。默认值为 90,即可以使用 90% 的磁盘。 |
yarn.nodemanager.disk-health-checker.min-free-space-per-disk-mb |
整数 | 磁盘检查器服务将磁盘标记为健康,磁盘上必须可用的最小可用空间量。此检查将针对 NodeManager 使用的每个磁盘运行。默认值为 0,即可以使用整个磁盘。 |
用户可以指定自己的健康检查器脚本,这些脚本将由健康检查器服务调用。用户可以指定超时以及要传递给脚本的选项。如果脚本超时、导致引发异常或输出以字符串 ERROR 开头的行,则该节点将被标记为不健康。请注意
退出代码不为 0 不被视为失败,因为它可能是由语法错误引起的。因此,该节点不会被标记为不健康。
如果由于权限或路径不正确等原因无法执行脚本,则会被视为失败,并且该节点将被报告为不健康。
指定健康检查脚本不是强制性的。如果未指定脚本,则仅使用磁盘检查器状态来确定节点的健康状况。
用户可以使用 yarn.nodemanager.health-checker.scripts
配置指定最多 4 个脚本来单独运行。此外,这些选项还可以针对所有脚本进行配置(全局配置)
配置名称 | 允许的值 | 说明 |
---|---|---|
yarn.nodemanager.health-checker.script |
字符串 | 健康检查器脚本的关键字,用逗号分隔。默认值为“script”。 |
yarn.nodemanager.health-checker.interval-ms |
正整数 | 健康检查器服务运行的时间间隔(以毫秒为单位);默认值为 10 分钟。 |
yarn.nodemanager.health-checker.timeout-ms |
正整数 | 执行的健康脚本的超时时间;默认值为 20 分钟。 |
可以为每个健康检查器脚本设置以下选项。%s 符号将替换为 yarn.nodemanager.health-checker.script
中提供的每个关键字。
配置名称 | 允许的值 | 说明 |
---|---|---|
yarn.nodemanager.health-checker.%s.path |
字符串 | 要运行的健康检查脚本的绝对路径。每个脚本的必填参数。 |
yarn.nodemanager.health-checker.%s.opts |
字符串 | 执行脚本时要传递给脚本的参数。每个脚本的必填参数。 |
yarn.nodemanager.health-checker.%s.interval-ms |
正整数 | 健康检查器服务运行的时间间隔(以毫秒为单位)。 |
yarn.nodemanager.health-checker.%s.timeout-ms |
正整数 | 执行的健康脚本的超时时间。 |
不需要指定时间间隔和超时选项。在这种情况下,将使用全局配置。
本文档概述了 NodeManager (NM) 重启,此功能使 NodeManager 能够在不丢失节点上运行的活动容器的情况下重新启动。从高层次来看,NM 在处理容器管理请求时将任何必要的状态存储到本地状态存储中。当 NM 重新启动时,它会先加载各个子系统的状态,然后让这些子系统使用加载的状态执行恢复,从而进行恢复。
步骤 1. 要启用 NM 重启功能,请将 conf/yarn-site.xml 中的以下属性设置为 true。
属性 | 值 |
---|---|
yarn.nodemanager.recovery.enabled |
true (默认值设置为 false) |
步骤 2. 配置 NodeManager 可以保存其运行状态的本地文件系统目录的路径。
属性 | 说明 |
---|---|
yarn.nodemanager.recovery.dir |
启用恢复时,节点管理器将在其中存储状态的本地文件系统目录。默认值设置为 $hadoop.tmp.dir/yarn-nm-recovery 。 |
步骤 3:启用恢复下的 NM 监管,以防止在 NM 退出时清理正在运行的容器。
属性 | 说明 |
---|---|
yarn.nodemanager.recovery.supervised |
如果启用,正在运行的 NodeManager 将不会尝试在退出时清理容器,因为它假设将立即重新启动并恢复容器。默认值设置为“false”。 |
步骤 4. 为 NodeManager 配置一个有效的 RPC 地址。
属性 | 说明 |
---|---|
yarn.nodemanager.address |
临时端口(端口 0,这是默认值)不能用于通过 yarn.nodemanager.address 指定的 NodeManager 的 RPC 服务器,因为它可能使 NM 在重新启动之前和之后使用不同的端口。这将中断在重新启动之前与 NM 通信的任何先前运行的客户端。将 yarn.nodemanager.address 明确设置为具有特定端口号的地址(例如 0.0.0.0:45454)是启用 NM 重新启动的先决条件。 |
步骤 5. 辅助服务。
YARN 集群中的 NodeManager 可以配置为运行辅助服务。对于完全正常运行的 NM 重新启动,YARN 依赖于任何配置为也支持恢复的辅助服务。这通常包括(1)避免使用临时端口,以便先前运行的客户端(在这种情况下,通常是容器)在重新启动后不会中断,以及(2)让辅助服务本身支持可恢复性,方法是在 NodeManager 重新启动并重新初始化辅助服务时重新加载任何先前状态。
上述内容的一个简单示例是 MapReduce (MR) 的辅助服务“ShuffleHandler”。ShuffleHandler 已经满足上述两个要求,因此用户/管理员不必为其支持 NM 重新启动做任何事情:(1)配置属性 mapreduce.shuffle.port 控制 NodeManager 主机上的 ShuffleHandler 绑定的端口,并且默认为非临时端口。(2)ShuffleHandler 服务还已经支持在 NM 重新启动后恢复先前状态。
有两种方法可以配置辅助服务,通过清单或通过配置。仅当辅助服务清单未启用时,辅助服务才会通过使用配置属性的先前方法加载。使用清单的一个优点是,NM 可以根据清单的更改动态重新加载辅助服务。为了支持重新加载,辅助服务实现必须在服务停止阶段执行所需的任何清理,以便 NM 能够创建辅助服务的新实例。
要在 NodeManager 上启动辅助服务,用户必须直接将自己的 jar 添加到 NodeManager 的类路径,从而将它们放在系统类加载器上。但是,如果类路径上存在多个版本的插件,则无法控制实际加载哪个版本。或者,如果辅助服务引入的依赖项与 NodeManager 本身之间有任何冲突,则它们可能会破坏 NodeManager、辅助服务或两者。为了解决此问题,我们可以使用不同于系统类加载器的类加载器实例化辅助服务。
本节介绍用于 aux 服务类路径隔离的辅助服务清单。要使用清单,必须在 yarn-site.xml 中将属性 yarn.nodemanager.aux-services.manifest.enabled
设置为 true。
要从文件系统加载清单文件,请在 yarn-site.xml 中的属性 yarn.nodemanager.aux-services.manifest
下设置文件路径。NM 将以 yarn.nodemanager.aux-services.manifest.reload-ms
指定的时间间隔检查此文件是否有新修改(默认为 0;设置时间间隔 <= 0 表示不会自动重新加载)。或者,可以通过向端点 http://nm-http-address:port/ws/v1/node/auxiliaryservices
发出 PUT 调用,将清单文件通过 REST API 发送到 NM。请注意,这只会更新一个 NM 上的清单。当 NM 读取新的清单时,它将根据清单中找到的服务名称和版本,根据需要添加、删除或重新加载辅助服务。
以下是一个示例清单,它为 CustomAuxService 配置了类路径隔离。可以指定一个或多个文件来组成服务的类路径,支持 jar 或归档格式。
{ "services": [ { "name": "mapreduce_shuffle", "version": "2", "configuration": { "properties": { "class.name": "org.apache.hadoop.mapred.ShuffleHandler", "mapreduce.shuffle.transfer.buffer.size": "102400", "mapreduce.shuffle.port": "13562" } } }, { "name": "CustomAuxService", "version": "1", "configuration": { "properties": { "class.name": "org.aux.CustomAuxService" }, "files": [ { "src_file": "${remote-dir}/CustomAuxService.jar", "type": "STATIC" }, { "src_file": "${remote-dir}/CustomAuxService.tgz", "type": "ARCHIVE" } ] } } ] }
本节介绍 aux 服务类路径隔离的配置变量。如果未指定清单文件,则仅从配置加载 aux 服务。
以下设置需要在 yarn-site.xml 中设置。
配置名称 | 说明 |
---|---|
yarn.nodemanager.aux-services.%s.classpath |
提供包含相关 jar 文件以及所有依赖项 jar 文件的本地目录。我们可以指定单个 jar 文件或使用 ${local_dir_to_jar}/* 加载 dep 目录下的所有 jar。 |
yarn.nodemanager.aux-services.%s.remote-classpath |
提供 jar 文件的远程绝对路径或相对路径(我们还支持 zip、tar.gz、tgz、tar 和 gz 文件)。对于相同的辅助服务类,我们只能指定以下配置之一:yarn.nodemanager.aux-services.%s.classpath 或 yarn.nodemanager.aux-services.%s.remote-classpath。将抛出 YarnRuntimeException。还要确保 jar 文件的所有者必须与 NodeManager 用户相同,并且 permbits 应满足 (permbits & 0022)==0(例如 600,组或其他用户不可写)。 |
yarn.nodemanager.aux-services.%s.system-classes |
通常,我们不需要设置此配置。如果类不属于 system-classes,则会从自定义类路径加载该类。例如,默认情况下,包 org.apache.hadoop 位于 system-classes 中,如果你的类 CustomAuxService 位于包 org.apache.hadoop 中,则不会从自定义类路径加载该类。要解决此问题,我们可以更改 CustomAuxService 的包,或配置我们自己的 system-classes,其中排除 org.apache.hadoop。 |
<property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle,CustomAuxService</value> </property> <property> <name>yarn.nodemanager.aux-services.CustomAuxService.classpath</name> <value>${local_dir_to_jar}/CustomAuxService.jar</value> </property> <!-- <property> <name>yarn.nodemanager.aux-services.CustomAuxService.remote-classpath</name> <value>${remote-dir_to_jar}/CustomAuxService.jar</value> </property> --> <property> <name>yarn.nodemanager.aux-services.CustomAuxService.class</name> <value>org.aux.CustomAuxService</value> </property> <property> <name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name> <value>org.apache.hadoop.mapred.ShuffleHandler</value> </property>
这允许集群管理员配置集群,以便在任何容器日志超过配置的大小时终止任务尝试。这有助于防止日志填满磁盘,还可以避免需要聚合巨大的日志。
可以使用以下参数配置容器日志目录大小。
配置名称 | 允许的值 | 说明 |
---|---|---|
yarn.nodemanager.container-log-monitor.enable |
true、false | 用于启用容器日志监视器的标志,该监视器强制执行容器日志目录大小限制。默认值为 false。 |
yarn.nodemanager.container-log-monitor.interval-ms |
正整数 | 以毫秒为单位检查容器日志目录使用情况的频率。默认值为 60000 毫秒。 |
yarn.nodemanager.container-log-monitor.dir-size-limit-bytes |
Long | 单个容器日志目录的磁盘空间限制(以字节为单位)。默认值为 1000000000。 |
yarn.nodemanager.container-log-monitor.total-size-limit-bytes |
Long | 容器所有日志的磁盘空间限制(以字节为单位)。默认值为 10000000000。 |
这允许集群管理员配置集群,以便根据节点的 CPU 利用率与集群的整体 CPU 利用率相比,调整资源管理器和每个 NodeManager 之间的心跳。
可以使用以下参数配置心跳间隔,以及是否调整以及如何调整。
配置名称 | 允许的值 | 说明 |
---|---|---|
yarn.resourcemanager.nodemanagers.heartbeat-interval-ms |
Long | 指定群集中每个 NodeManager 的默认心跳间隔(以毫秒为单位)。默认值为 1000 毫秒。 |
yarn.resourcemanager.nodemanagers.heartbeat-interval-scaling-enable |
true、false | 启用心跳间隔缩放。如果为 true,NodeManager 心跳间隔将根据节点上的 CPU 利用率与集群范围内的平均 CPU 利用率之间的差异进行缩放。默认值为 false。 |
yarn.resourcemanager.nodemanagers.heartbeat-interval-min-ms |
正长整数 | 如果启用了心跳间隔缩放,则这是以毫秒为单位的最小心跳间隔。默认值为 1000 毫秒。 |
yarn.resourcemanager.nodemanagers.heartbeat-interval-max-ms |
正长整数 | 如果启用了心跳间隔缩放,则这是以毫秒为单位的最大心跳间隔。默认值为 1000 毫秒。 |
yarn.resourcemanager.nodemanagers.heartbeat-interval-speedup-factor |
正浮点数 | 如果启用了心跳间隔缩放,则这将控制加快心跳间隔时的调整程度。在 1.0 时,低于平均集群范围 CPU 利用率 20% 将导致心跳间隔减少 20%。默认值为 1.0。 |
yarn.resourcemanager.nodemanagers.heartbeat-interval-slowdown-factor |
正浮点数 | 如果启用了心跳间隔缩放,则这将控制减慢心跳间隔时的调整程度。在 1.0 时,高于平均集群范围 CPU 利用率 20% 将导致心跳间隔增加 20%。默认值为 1.0。 |