7.3.3 命令执行
JobTracker将心跳应答封装到一个HeartbeatResponse对象中。该对象主要包括两部分内容:第一部分是作业集合recoveredJobs,它是上次关闭JobTracker时正在运行的作业集合,重启JobTracker后需恢复这些作业的运行状态(前提是用户启用了作业恢复功能,具体参考第6章),而TaskTracker收到该作业集合后,需重置这些作业对应Reduce Task的FetchStatus信息,从而迫使这些Reduce Task重新从Map Task端拷贝数据;另一部分是需要执行的命令列表,相关代码如下。
TaskTrackerAction[]actions=heartbeatResponse.getActions();
if(reinitTaskTracker(actions)){//重新初始化
return State.STALE;
}
if(actions!=null){
for(TaskTrackerAction action:actions){
if(action instanceof LaunchTaskAction){//启动新任务
addToTaskQueue((LaunchTaskAction)action);
}else if(action instanceof CommitTaskAction){//提交任务
CommitTaskAction commitAction=(CommitTaskAction)action;
if(!commitResponses.contains(commitAction.getTaskID())){
commitResponses.add(commitAction.getTaskID());
}
}else{//杀死任务或者作业
tasksToCleanup.put(action);
}
}
}
TaskTracker需要处理5种命令:启动新任务(LaunchTaskAction)、提交任务(CommitTaskAction)、杀死任务(KillTaskAction)、杀死作业(KillJobAction)和重新初始化(ReinitTrackerAction)。我们将在下一节中介绍各个命令的处理过程。