五.TaskTracker接受HeartbeatResponse
TaskTracker根据HeartbeatResponse的返回内容调用addToTaskQueue方法
-------------------------------------------------
privatevoidaddToTaskQueue(LaunchTaskActionaction){
if(action.getTask().isMapTask()){
mapLauncher.addToTaskQueue(action);
}else{
reduceLauncher.addToTaskQueue(action);
}
}
如果是maptask就用mapLauncher,如果是reducetask就用reduceLauncher,他们都是TaskLauncher对象,TaskLauncher是TaskTracker的内部类,所以调用这个内部类的addToTaskQueue方法,而且他是一个线程类,在TaskTracker初始化的时候就调用了他的run方法
-----------------------------------------------------------------
publicvoidrun(){
。。。
startNewTask(tip);
。。。
}
-----------------------------------------------------------------
startNewTask方法如下:它里面调用了localizeJob方法
-----------------------------------------------------------------
/**
*Start a new task
*/
privatevoidstartNewTask(TaskInProgresstip){
localizeJob(tip);
}
-----------------------------------------------------------------
来看看localizeJob()方法:
-----------------------------------------------------------------
//进行task的初始化,将task所需要的数据等从HDFS上加载到本地,最后调用//launchTaskForJob方法,它又是调用了TaskInProgress类的一个方法//launchTask();该方法创建并启动了runner,他是TaskRunner的对象,TaskRunner是一//个线程类,可以查看它的run()方法
privatevoidlocalizeJob(TaskInProgresstip)throwsIOException{
PathlocalJarFile=null;
Task t = tip.getTask();
JobIDjobId=t.getJobID();
PathjobFile=newPath(t.getJobFile());
。。。。
。。。。
。。。。
launchTaskForJob(tip,newJobConf(rjob.jobConf));
}
launchTask代码如下:
-----------------------------------------------------------------
/**
*Kick off the task execution
*创建并启动了runner,他是TaskRunner的对象,TaskRunner是一个线程类,
*可以查看它的run()方法
*/
publicsynchronized void launchTask() throws IOException {
。。。。
。。。。
this.runner= task.createRunner(TaskTracker.this, this);
this.runner.start();
this.taskStatus.setStartTime(System.currentTimeMillis());
。。。
}
-----------------------------------------------------------------
TaskRunner是一个线程类,它能够runsataskinaseparateprocess. Tasksareruninaseparateprocessinordertoisolatethemap/reducesystemcodefrombugsinusersuppliedmapandreducefunctions.
???????????????????????????????????????????????????????晕??????????????????????
???????????????????????????????????????
之后再看。。。。。。。。
总之是最后通过jvmManager.launchJvm方法,然后一系列的方法(可以查看源码了解之,像reapJvm,spawnNewJvm开启JvmRunner线程,继而调用runChild方法,最后调用到Child类)初始化了一个JVM等,最后调用Child类里面的task.run开始runthetask,调用了Task抽象类的run方法,实际上它是根据不同的task(maptaskorreducetask)来调用MapTask或者是ReduceTask里面的run方法,见下节内容。