概述
节点健康状况检测是YARN为每个NodeManager提供的机制,通过该机制,NodeManager可通过心跳机制将节点健康状况实时汇报给ResourceManager,而ResourceManager则会根据每个NodeManager的健康状况适当调整分配的任务数目。当NodeManager认为自己的健康状况“欠佳”时,可让ResourceManager不再分配任务,待健康状况好转时,再分配新任务。
(注意:本文分析基于hadoop-2.0.3-alpha)
实现原理
NodeManager上有专门一个服务判断所在节点的健康状况,该服务通过两种办法判断 节点健康状况,第一种是通过管理员自定义的Shell脚本,NodeManager上专门有一个周期性任务执行该脚本,一旦该脚本输出以“ERROR”开头的字符串,则认为节点处于不健康状态,另一种是判断磁盘好坏,NodeManager上专门有一个周期性任务检测磁盘的好坏,如果坏磁盘数目达到一定的比例,则认为节点处于不健康状态。
(1)编写健康状况检测脚本
管理员需编写一个shell脚本,当认为节点处于不健康状态时,输出一个以“ERROR”开头的字符串,一段伪代码如下:
#! /bin/bash
If [ free memory is lower than 1GB ];do
echo “ERROR, free memory is lower than 1GB!”
done
然后管理员通过参数yarn.nodemanager.health-checker.script.path在yarn-site.xml中指定脚本所在位置。这样,当剩余内存量低于1GB时,NodeManager会将健康状况置为false,并通过心跳机制 汇报给ResourceManager,当ResourceManager收到该消息后,将该节点移到黑名单中,不再为其分配新任务,直到健康状况为true。
(2) 检测磁盘好坏
NodeManager会通过参数yarn.nodemanager.local-dirs和yarn.nodemanager.log-dirs配置一系列目录(磁盘),用于存储Application中间结果(比如MapReduce中Map Task的中间输出结果)和日志文件。NodeManager上专门有一个周期性任务检测这些目录的好坏,一旦发现正常磁盘的比例低于yarn.nodemanager.disk-health-checker.min-healthy-disks(默认是25%),则认为该节点处于“不健康”的状态。管理员可通过参数yarn.nodemanager.disk-health-checker.enable设置是否启用该功能,默认情况下是启用的。
NodeManager判断一个目录(磁盘)好坏的方法是,当它同时满足以下条件时才认为是正常目录:可读、可写、写执行。