节点健康监测是 NodeManager 自带的健康状态诊断机制。通过该机制,NodeManager 可以时刻掌握自己的健康状况,并及时汇报给 ResourceManager,ResourceManager 根据节点的健康状况调整分配的任务数目。如果任何健康监测失败,NodeManager 会将该节点标记处于不健康状态,并将其传达给 ResourceManager,后者会停止将新任务分配给该节点,直到节点标记为健康状态。该机制不仅可以帮助及时发现存在问题的 NodeManager,避免不必要的任务分配,也可以用于动态升级(通过脚本指示 ResourceManager 不再分配任务,等到 NodeManager 上面的任务运行完成后,对它进行升级)。
NodeManager 上有专门一个服务判断所在节点的健康状况,该服务通过两种策略判断节点健康状况,第一种是监测磁盘损坏,第二种是通过管理员自定义的健康监测脚本。
YARN 提供了一种判断 NodeManager 是否健康的机制:检测磁盘损坏数目。管理员可通过参数 yarn.nodemanager.disk-health-checker.enable 设置是否启用该功能,默认情况是启用的。该机制是由 LocalDirsHandlerService 服务实现,周期性检测 NodeManager 本地磁盘的好坏,一旦发现正常磁盘的比例低于一定的比例,则认为节点处于不健康状态,便通过心跳告诉 ResourceManager,从而不再接收到新的任务。
管理员配置 YARN 时,会设置 NodeManager 的本地可用目录列表:
${hadoop.tmp.dir}/nm-local-dir
。${yarn.log.dir}/userlogs
。{hadoop.tmp.dir} 通过 hadoop.tmp.dir 参数在 core-site.xml 中配置、{yarn.log.dir} 是 Java 属性,在 yarn-env.sh 中配置。
这些目录的可用性直接决定着 NodeManager 的可用性。因此,NodeManager 作为节点的代理和管理者,应该负责检测这两类目录列表的可用性,并及时将不可用目录剔除掉。NodeManager 判断一个目录所在磁盘好坏的方法是:如果一个目录具有读、写和执行权限,并且有满足要求的可用磁盘空间,则认为它是正常的,否则将被加入坏磁盘列表。LocalDirsHandlerService 服务中专门有一个定时任务周期性检测这些磁盘的好坏,一旦发现正常磁盘的比例低于阈值,该节点就被标记处于不健康状态,此后 ResourceManager 不再为它分配新任务。
具体通过如下配置参数来监测磁盘损坏情况:
例如,通过如下信息可以了解到磁盘的最大使用率超过了 90%,从而导致节点处于不健康状态:
使用 df -h 查看磁盘使用情况,发现磁盘确实已经超过可 90%,可以在 yarn-site.xml 文件中配置如下参数:
<property>
<name>yarn.nodemanager.disk-health-checker.max-disk-utilization-per-disk-percentage</name>
<value>98.5</value>
</property>
如果从根据上解决问题,还是要删除磁盘上的文件,确保磁盘空间的使用率低于 90%。
除了监测磁盘损坏情况,用户也可以通过在脚本中执行监测来判断该节点是否处于健康状态。如果脚本监测到节点不健康,可以打印一个标准的 ERROR(错误)输出。用户需要通过 yarn.nodemanager.health-checker.script.path 参数来指定健康监测脚本。NodeManager 会通过这些脚本周期性检查脚本输出,如果脚本输出以 ERROR 开头的行,该节点被标记处于不健康状态,并将节点加入到 ResourceManager 的黑名单列表中,也不会将任务分配到该节点上。然后 NodeManager 继续跑这些脚本,如果节点标记处于健康状态了,将自动从 ResourceManager 的黑名单列表中删除。除了上述所说的输出以 ERROR 开头的行之外,还有两种情况也认为节点处于不健康状态:
但需要注意的是:
如下三个是全局配置参数,对所有的脚本都有效:
除了全局配置参数之外,还可以为每个健康监测脚本单独设置参数,如下所示:
%s 符号替换为 yarn.nodemanager.health-checker.script 中提供的关键字。例如,默认为 ‘script’,上述第一个参数变为:yarn.nodemanager.health-checker.script.path