Hadoop之MapReduce框架心跳机制分析(4)

healthStatus是由NodeHealthCheckerService线程计算得到,该线程允许管理员配置一个“监控监测脚本”以监测节点健康状况,且管理员可以在该脚本中添加任务监测语句作为节点是否健康运行的依据。如果脚本检测到该节点处于不健康状态,它需要再标准输出中打印一条以字符串“ERROR”开头的输出语句。NodeHealthCheckerService线程周期性调用健康检测脚本并检测其输出,一旦发现脚本输出是以“ERROR”开头的字符串,则认为该节点不健康,进而将其标注为“unhealthy”并通过心跳告诉JobTracker,而JobTracker得知节点状态为“unhealthy”后,会将其加入黑名单,此后不再为它分配新任务。需要注意的是,只要TaskTracker服务是活的,该线程就会一直运行该脚本,一旦发现节点又变为“healthy”,JobTracker会立刻将其从黑名单中移除,从而又会为之分配新任务。通过引入该机制,可以带来很多好处:

可作为节点负载的反馈:比如,可让健康检测脚本检测网络、磁盘、文件系统等运行情况,一旦发现特殊情况,比如网络拥塞、磁盘空间不足或者文件系统出现问题,可以将健康状态变为“unhealthy”,暂时不接收新的任务,等待它们恢复正常后再继续接收新任务。

人为暂时维护TaskTracker:如果发现TaskTracker所在节点出现故障,可以通过控制脚本输出暂时让该TaskTracker停止接收新任务以便进行维护,等待维护完成后,修改脚本输出以让TaskTracker继续正常接收任务。

NodeHealthCheckerService线程包含了4个可配置参数,用户可以再mapred-site.xml中记性配置:

(1)mapred.healthChecker.script.path:健康检测脚本所在的绝对路径,NodeHealthCheckerService会周期性执行该脚本以判断节点健康状态,如果该值为空,则不会启动该线程。

(2)mapred.healthChecker.interval:健康检测脚本调用频率(单位:ms).

(3)mapred.healthChecker.script.timeout:如果检测脚本在一定时间内没有响应,则NodeHealthCheckerService线程会将该节点的监控状态标注为“unhealthy”。

(4)mapred.healthChecker.script.args:监控脚本的输入参数,如果有多个参数,则用逗号分开。

下面是一个健康监控脚本实例。在shell脚本中,当一个节点上的空闲内存量低于10%时,打印“ERROR”开头的字符串,这样该节点将不再向JobTracker请求信任务。

#!/bin/bash
MEMORY_RATIO=0.1
freeMem=`grep MemFree /proc/meminfo |awk '{print $2}'`
totalMem=`grep MemTotal /proc/meminfo | awk '{print $2}'`
limitMem=`echo | awk '{print int("'$totalMem'"*"'$MEMORY_RATIO'")}'`
if [$freeMem -lt $limitMem];then
  echo "ERROR,totalMem=$totalMem, freeMem=$freeMem, limitMem=$limitMem"
else
  echo "Ok,totalMem=$totalMem, freeMem=$freeMem, limitMem=$limitMem"
fi

过程五,发送心跳。

接收并执行JobTracker通过心跳返回的指令,详细流程看上面的流程图。

3、JobTracker端心跳机制

参考文献:

[1]《Hadoop技术内幕:深入解析MapReduce架构设计与实现原理》

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/176210ad19147bb1f2409d52c130c462.html