启动过程
TaskTracker是一个独立的服务,有一个对应的main函数启动它。
TaskTracker构造函数中初始化一些重要对象和线程,再run方法中维护一个与JobTracker的通信连接,以周期性地向JobTracker发送心跳并领取新的任务。
变量初始化
对象初始化
心跳机制
单次心跳发送
TaskTracker会主动汇报信息并领取对应的命令,TaskTracker周期性向JobTracker汇报信息并领取任务形成心跳。
状态发送
TaskTracker发送的信息被封装到可序列化类TaskTrackerStatus中,每次发送心跳,就重新构造一个TaskTrackerStatus。
TaskTrackerStatus有三个重要变量:taskReport、healthStatus、resStatus。
taskReport
taskReport保存当前TaskTracker上所有任务(实际为Task Attempt)的运行状态。
healthStatus
保存当前节点健康状态。
healthStatus有NodeHealthCheckerService线程计算得到的,该线程允许管理员配置一个“健康检测脚本”,检查节点健康状况。该线程周期性调用健康检测脚本并检查其输出,如果输出是“ERROR”开头的字符串,则认为节点不健康, 标注为unhealthy,并通过心跳告诉JobTracker,JobTracker得知节点状态变为unhealthy后,将其加入黑名单。如果发现变为healthy,就从黑名单移除。
好处:
- 作为节点负载的反馈:可让健康检测脚本检查网络、磁盘、文件系统等运行状况、一旦发现特殊情况,比如网络拥塞、磁盘空间不足、或者文件系统出现问题,可将健康状况变为unhealthy。
- 人为暂时维护TaskTracker,如果发现TaskTracker所在节点出现故障,可通过控制简本输出暂时让该Task Tracker停止接收新任务以便进行维护,维护完了再改脚本输出,继续接收新任务。
resStatus
保存当前TaskTracker资源使用情况,该变量对应ResourceStatus类。
命令执行
JobTracker将心跳应答封装到一个HeartbeatResponse对象中,该对象主要包括:①作业集合recoveredJobs,主要是上次关闭JobTracker时正在运行的作业集合,重启JobTracker后要恢复这些作业的运行状态②需要执行的命令列表