1.此次仅说明一个task任务的执行流程
task是由taskTracker负责执行的,在taskTracker中,有两个控件:
TaskLauncher。一个
TaskLauncher为map的
TaskLauncher,一个为reduce的
TaskLauncher。这两个控件在taskTrack初始化的时候也初始化。
TaskLauncher内部有一个
tasksToLaunch的队列,这个队列是放置要执行任务的。
TaskLauncher是一个线程,其内部会一直检查
tasksToLaunch
队列是否为空,不为空的话就立马从立马取出一个task进行执行,整个的执行就在这个run方法里面,一直到执行的liunx的shell里
TaskLauncher.run() -->
startNewTask(tip);--->
launchTaskForJob(tip,
new
JobConf(rjob.getJobConf()), rjob); --->
tip.launchTask(rjob);--->
this
.runner.start(); (
TaskRunner
) --->
launchJvmAndWait(setupCmds, vargs, stdout, stderr, logSize, workDir); --->
jvmManager
.launchJvm(this, j
vmManager
.constructJvmEnv(setup, vargs, stdout,
stderr, logSize, workDir,
conf
)); --->
mapJvmManager
.reapJvm(t, env); 或
reduceJvmManager
.reapJvm(t, env); ---》
spawnNewJvm(jobId, env, t); ---》
jvmRunner.start(); --》 ....
2.那好,我们已经知道taskTracker执行task其实是
TaskLauncher运行期内部的task进而执行的,那么这写task是从什么地方获取来的呢? 其实通过和jobTracker进行心跳的时候获取来的
首先taskTracker启动的时候调用main,main调用其run方法,run方法调用
offerService
() 方法
在taskTracker里的
offerService() 方法中会持续的和jobTracker保存心跳
HeartbeatResponse heartbeatResponse =
transmitHeartBeat
(now);,并从心跳中获取任务action
TaskTrackerAction[]
actions
= heartbeatResponse.getActions();当action为
if
(action
instanceof
LaunchTaskAction) {
时会
addToTaskQueue((LaunchTaskAction)action);将其加入到lanuncer的任务队列中去
if (action.getTask().isMapTask()) {
mapLauncher.addToTaskQueue(action);
} else {
reduceLauncher.addToTaskQueue(action);
}
而对应的这两个队列都在启动监听队列是否有任务,有任务就运行 (看 1),这样分配来的任务就运行起来了