三.再次回到JobTracker看看心跳机制是怎么回复的,哈哈。。。
当TaskTracker将heartbeat通过RPC发送到JobTracker时,会触发JobTracker的heartbeat()方法,具体见下面(我只是将流程分析了一下,其他的都是一些辅助类,以后慢慢看罗!):
-----------------------------------------------------------------
/**
*Theperiodicheartbeatmechanismbetweenthe{@linkTaskTracker}and
*the{@linkJobTracker}.
*
*The{@linkJobTracker}processesthestatusinformationsentbythe
*{@linkTaskTracker}andrespondswithinstructionstostart/stop
*tasks or jobs, and also 'reset' instructions during contingencies.
*/
publicsynchronizedHeartbeatResponseheartbeat(TaskTrackerStatusstatus,
booleanrestarted,
booleaninitialContact,
booleanacceptNewTasks,
shortresponseId)
throwsIOException{
。。。
StringtrackerName = status.getTrackerName();
。。。
shortnewResponseId=(short)(responseId+1);
。。。
//Initializetheresponsetobesentfortheheartbeat
HeartbeatResponseresponse=newHeartbeatResponse(newResponseId,null);
List<TaskTrackerAction>actions
=newArrayList<TaskTrackerAction>();
//如果tasktracker向一个jobtracker请求一个task运行
if(acceptNewTasks){
TaskTrackerStatustaskTrackerStatus = getTaskTracker(trackerName);
if(taskTrackerStatus==null){
LOG.warn("Unknowntasktrackerpolling;ignoring:"+trackerName);
}else{
//setup和Cleanup的task优先级最搞,下面这个方法是returns//cleanuptasksfirst,thensetuptasks.
List<Task> tasks
=getSetupAndCleanupTasks(taskTrackerStatus);
if(tasks==null){
//采用默认的任务调度器分配任务
tasks= taskScheduler.assignTasks(taskTrackerStatus);
}
if(tasks!=null){
for(Tasktask:tasks){
//这个是将task放入一个队列中,该队列能监控该任务,如果完成之后长时间还存在就杀死它
expireLaunchingTasks.addNewTask(task.getTaskID());
LOG.debug(trackerName+"->LaunchTask:"+task.getTaskID());
//将任务放到Action列表里面,返回给TaskTracker
actions.add(newLaunchTaskAction(task));
}
}
}
}
。。。
//calculate next heartbeat interval and put in heartbeat response
intnextInterval=getNextHeartbeatInterval();
response.setHeartbeatInterval(nextInterval);
response.setActions(
actions.toArray(newTaskTrackerAction[actions.size()]));
。。。
returnresponse;
}