TaskTracker执行map或reduce任务的过程(二)
上次说到,当MapLauncher或ReduceLancher(用于执行任务的线程,它们扩展自TaskLauncher),从它们所维护的LinkedList也即队列中获取到TaskInProgress,并且TaskTracker有空闲的slot时,该线程就调用了TaskTracker的startNewTask(tip)方法,如下所示:
- public void run() {
- while (!Thread.interrupted()) {
- try {
- TaskInProgress tip;
- Task task;
- synchronized (tasksToLaunch) {
- while (tasksToLaunch.isEmpty()) {
- tasksToLaunch.wait();//当队列为空时呗阻塞,知道有新的tip到来才会被唤醒
- }
- //get the TIP
- tip = tasksToLaunch.remove(0);
- task = tip.getTask();
- ......//当有空闲的slot时执行启动一个任务
- startNewTask(tip);
- ......
- }
- }
接下了来就让我们看下startNewTask(tip)的神秘面纱吧,由于在其内部通过实习Runnable创建了一个线程,我们只需分析线程体的run方法即可,关键代码如下,为便于说明,给3个核心语句分别标识为**1,**2:
- public void run() {
- try {
- RunningJob rjob = localizeJob(tip); //**1
- tip.getTask().setJobFile(rjob.getLocalizedJobConf().toString());
- // task本地化已经完成,此刻如果rjob.jobConf或者rjob.ugi为空的话,会抛出异常
launchTaskForJob(tip, new JobConf(rjob.getJobConf()), rjob); //**2
......
} }
**1的源码如下,
- Task t = tip.getTask();
- JobID jobId = t.getJobID();
- RunningJob rjob = addTaskToJob(jobId, tip);
- InetSocketAddress ttAddr = getTaskTrackerReportAddress();
从中我们可以看出,首先创建了一个该任务所属的RunningJob,并把它放入到一个该TaskTracker所维护的TreeMap<jobId,RunningJob>中,同时在RunningJob中记录将要执行的task,也即把tip放入到RunningJob.tasks(一个HashSet<TaskInProgress>)中。由此,我们可以知道,每个TaskTracker都维护者一个TreeMap用以记录它正在执行的哪个作业的哪些任务(map、reduce任务)。
接下来localizeJob(tip)要做的就是调用initializeJob(t, rjob, ttAddr)初始化工作目录,并下载相应的job.xml以及job.jar(TaskController负责)文件,TaskController最后调用RunJar.unJar()将包解压到相应的工作目录,,至此初始化工作完成,调用launchTaskForJob开始执行Task。
**2的核心代码为:
- protected void launchTaskForJob(TaskInProgress tip, JobConf jobConf,RunningJob rjob) throws IOException {
- synchronized (tip) {
- jobConf.set(JobConf.MAPRED_LOCAL_DIR_PROPERTY,
- localStorage.getDirsString());
- tip.setJobConf(jobConf);
- tip.setUGI(rjob.ugi);
- tip.launchTask(rjob);
- }
- }
由此看出,它主要是调用TaskTracker.TaskInProgress的launchTask()方法,在该方法中它创建了一个TaskRunner线程,并启这个线程执行这个task,其run方法核心代码如下:
- public final void run() {
//设置工作目录- final File workDir = new File(new Path(localdirs[rand.nextInt(localdirs.length)],
- TaskTracker.getTaskWorkDir(t.getUser(), taskid.getJobID().toString(),
- taskid.toString(),
- t.isTaskCleanupTask())).toString());
......
// 设置环境变量- List<String> classPaths = getClassPaths(conf, workDir,taskDistributedCacheManager);
- .......
- //启动Task子进程
- launchJvmAndWait(setupCmds, vargs, stdout, stderr, logSize, workDir);
- }
- }
未完待续......
TaskTracker执行map或reduce任务的过程(二)的更多相关文章
- TaskTracker执行map或reduce任务的过程2
TaskTracker执行map或reduce任务的过程(二) 上次说到,当MapLauncher或ReduceLancher(用于执行任务的线程,它们扩展自TaskLauncher),从它们所维护的 ...
- TaskTracker获取并执行map或reduce任务的过程1
TaskTracker获取并执行map或reduce任务的过程(一) 我们知道TaskTracker在默认情况下,每个3秒就行JobTracker发送一个心跳包,也就是在这个心跳包中包含对任务的请求. ...
- TaskTracker获取并执行map或reduce任务的过程(一)
我们知道TaskTracker在默认情况下,每个3秒就行JobTracker发送一个心跳包,也就是在这个心跳包中包含对任务的请求.JobTracker返回给TaskTracker的心跳包中包含有各种a ...
- 匿名函数 python内置方法(max/min/filter/map/sorted/reduce)面向过程编程
目录 函数进阶三 1. 匿名函数 1. 什么是匿名函数 2. 匿名函数的语法 3. 能和匿名函数联用的一些方法 2. python解释器内置方法 3. 异常处理 面向过程编程 函数进阶三 1. 匿名函 ...
- MapReduce剖析笔记之五:Map与Reduce任务分配过程
在上一节分析了TaskTracker和JobTracker之间通过周期的心跳消息获取任务分配结果的过程.中间留了一个问题,就是任务到底是怎么分配的.任务的分配自然是由JobTracker做出来的,具体 ...
- hadoop1——map到reduce中间的shuffle过程
---恢复内容开始--- shuffle和排序 过程图如下: MapReduce确保每个reduce的输入都按键排序,系统执行排序的过程——将map输出作为输入传给reduce——成为shuffle, ...
- (转) hadoop 一个Job多个MAP与REDUCE的执行
http://blog.csdn.net/chaoping315/article/details/6221440 在hadoop 中一个Job中可以按顺序运行多个mapper对数据进行前期的处理,再进 ...
- MapReduce剖析笔记之七:Child子进程处理Map和Reduce任务的主要流程
在上一节我们分析了TaskTracker如何对JobTracker分配过来的任务进行初始化,并创建各类JVM启动所需的信息,最终创建JVM的整个过程,本节我们继续来看,JVM启动后,执行的是Child ...
- Hadoop :map+shuffle+reduce和YARN笔记分享
今天做了一个hadoop分享,总结下来,包括mapreduce,及shuffle深度讲解,还有YARN框架的详细说明等. v\:* {behavior:url(#default#VML);} o\:* ...
随机推荐
- response小结(五)—通过response实现请求重定向
请求重定向指的是一个web资源收到客户端请求后,通知客户端去访问另外一个web资源,这称之为请求重定向.302状态码和location头即可实现重定向. 请求重定向最常见的应用场景就是用户登录. 下面 ...
- sql常识-FULL JOIN
SQL FULL JOIN 关键字 只要其中某个表存在匹配,FULL JOIN 关键字就会返回行. FULL JOIN 关键字语法 SELECT column_name(s) FROM table_n ...
- 断开SVN连接操作方法
SVN是日常项目管理中经常使用到的工具,然而拷贝备份需要与SVN服务器断开连接,具体操作步骤: 1.在桌面建立一个文本文件,取名为kill-svn-folders.reg(扩展名由txt改为reg), ...
- mysql5.7版本免安装配置教程
自己花了两天时间才搞清楚,希望对新手有一定帮助,有问题可以联系哦! mysql分为安装版本msi,免安装要压缩版本ZIP,下载网址:http://dev.mysql.com/downloads 免安装 ...
- OC4_实例变量的作用域
// // Dog.h // OC4_实例变量的作用域 // // Created by zhangxueming on 15/6/16. // Copyright (c) 2015年 zhangxu ...
- javascript笔记——js的阻塞特性[转载]
JS具有阻塞特性,当浏览器在执行js代码时,不能同时做其它事情,即<script>每次出现都会让页面等待脚本的解析和执行(不论JS是内嵌的还是外链的),JS代码执行完成后,才继续渲染页面. ...
- CSS样式一
样式 首先明确: HTML标签也有标签的属性,CSS中的样式也称作为属性,而且某些html中的属性与css中的属性同名,并且作用也相同,但是属于不同的技术. 尺寸样式: 几乎所有的标签有可以设置 wi ...
- 【leetcode】5. Longest Palindromic Substring
题目描述: Given a string S, find the longest palindromic substring in S. You may assume that the maximum ...
- 关键字 virtual
Virtual是C++ OO机制中很重要的一个关键字.只要是学过C++的人都知道在类Base中加了Virtual关键字的函数就是虚拟函数(例如函数print),于是在Base的派生类Derived中就 ...
- Gitlab 与 Git Windows 客户端一起使用的入门流程
我的技术博客经常被流氓网站恶意爬取转载.请移步原文:http://www.cnblogs.com/hamhog/p/3824934.html,享受整齐的排版.有效的链接.正确的代码缩进.更好的阅读体验 ...