NodeManager

概述

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 重启

简介

本文档概述了 NodeManager (NM) 重启,此功能使 NodeManager 能够在不丢失节点上运行的活动容器的情况下重新启动。从高层次来看,NM 在处理容器管理请求时将任何必要的状态存储到本地状态存储中。当 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 利用率与集群的整体 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。