每个 NodeManager 节点内置提供了检测自身健康状态的机制(详情参见NodeHealthCheckerService);通过这种机制,NodeManager 会将诊断出来的监控状态通过心跳机制汇报给 ResourceManager,然后ResourceManager 端会通过RMNodeEventType.STATUS_UPDATE 更新 NodeManager 的状态;如果此时的 NodeManager 节点不健康,那么ResourceManager 将会把 NodeManager 状态变为 NodeState.UNHEALTHY 。关于 NodeManager的状态之间的转移请参见NodeManager生命周期介绍。这种内置的健康检测机制主要包括以下两种:
- 健康状况检测脚本
- 本地目录健康检测
健康状况检测脚本
每个 NodeManager 上都有一个名为 NodeHealthScriptRunner 的类,其会启动一个名为 NodeHealthMonitor-Timer 的 Timer 定期执行(默认每个十分钟实行一次,由参 yarn.nodemanager.health-checker.interval-ms 指定)用户编写的用于检测 NodeManager 健康状态的脚本,这个脚本是通过参数 yarn.nodemanager.health-checker.script.path 指定的。一旦发现以下几种结果则认为节点处于不健康状态:
- 脚本输出包含以”ERROR”开头的字符串,不顾是一个还是多个都算
- 执行脚本的时候出现超时
- 执行脚本出现异常
如果执行脚本出现了 ExitCodeException异常,并不认为NodeManager节点健康出现异常,因为脚本可能编写错误。NodeHeal