您的位置:首页 > 其它

taskTracker请求任务执行任务的过程

2013-11-12 14:51 281 查看
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,
jvmManager.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),这样分配来的任务就运行起来了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: