linux服务器唤醒task,Task在TaskTracker上执行环境的准备

在这两篇文章中(见 http://www.linuxidc.com/Linux/2012-01/50855.htm 与 http://www.linuxidc.com/Linux/2012-01/50856.htm),我详细的介绍了Job的任务分解以及Job任务的调度,同时也讲述了TaskTracker是每一通过向JobTracker发送心跳包heartbeat并从其响应中获取自己被分配的任务的。那么,在TaskTracker中,它是如何来执行这些Task的呢,或者说为这个Task的执行做了哪些准备工作呢?

其实,在一个TaskTracker节点中,每一Task的执行并不是在当前这个TaskTracker所属的进程中完成的,而是对每一个Task,都从新开启一个对应的JVM进程,让这个JVM进程来执行这个Task,同时这个JVM进程通过网络通行的方式来和开启它的TaskTracker进行交互,报告对应的Task的执行进度。这个执行模型可简单理解为:

5dcffa5b1c1ef3628e45a04ebe2582c9.gif

在这里,我将详细为大家讨论TaskTracker是如何从接收到Task,到开始执行这个Task中间的过程,至于Child是如何执行Task的,在本文我不会作详细的讨论(但我会在以后的博文中详细的阐述)。我把这个过程成为Task的执行准备阶段,先来看看与之相关的类图吧!这个类体系图相当的复杂:

de68424494d9a538494fc537e190aadb.gif

好了,我们再来看看与这些相关的时序图,以便更详细地了解TaskTracker是如何为一个新来的Task准备JVM运行环境的。

87a2c759bb35968c2589507094e84b38.gif

了解了每一个先关类及其方法的调用时序关系之后,就来看看这些类中的一些重要方法到底都具体干了那些事?

1.TaskTracker.registerTask()

该方法为新来的一个Task创建一个对应的TaskInProgress对象,同时在任务集合tasks和正在运行的任务集合中runningTasks中保存Task和TaskInProgress的映射关系,并根据Task的类型更新当前TaskTracker的map/reduce任务数量。

2.TaskTracker.addTaskToJob()

检查该Task所属的Job是否已在TaskTracker运行,如果没有,则创建该Job的一个RunningJob对象,并把该Task放到RunningJob中,最后放回该Task‘s Job的RunningJob。

3.TaskTracker.localizeJob()

如果Task对应的RunningJob还没有本地化,则需要本地化该Job。本地化该Job实际上就是根据JobID信息从HDFS中下载该Job对应的配置文件job.xml和运行文件job.jar到本地的文件系统。TaskTracker会为每一个Job创建一个目录,这个目录放在$(mapred.local.dir)/taskTracker/jobcache/下面,这里的$(mapred.local.dir)指的是mapreduce的配置文件中的mapred.local.dir项的值。Job的job.xml文件被放在Job的本地目录下:$(mapred.local.dir)/taskTracker/jobcache/jobid/job.xml,而Job的运行文件job.jar被放在Job的本地目录的子目录jars/下:$(mapred.local.dir)/taskTracker/jobcache/jobid/jars/job.jar,然后根据当前Job的实际配置信息重写job.xml文件,同时解压文件job.jar。

4.TaskInProgress.localizeTask()

首先会为该Task创建一个本地目录,目录名是该Task的id,这个目录在Task所属的Job的本地目录下:$(mapred.local.dir)/taskTracker/jobcache/jobid/taskid/,如果该Task的本地目录已存在,则需先清空该Task的本地目录。同时,在该目录下创建一个该Task被调用执行JVM时的工作目录:$(mapred.local.dir)/taskTracker/jobcache/jobid/taskid/work/,然后将当前Task的详细配置信息写入Task的配置文件$(mapred.local.dir)/taskTracker/jobcache/jobid/taskid/job.xml中。

5.TaskRunner.run()

TaskRunner会将Task运行所依赖的第三方工具包、归档文件、普通文件等从HDFS复制到TaskTracker的本地文件系统,并且包这些文件缓存起来,以供其他的Task使用。这些文件被保存在$(mapred.local.dir)/taskTracker/archive/下面,同时这些文件的相对路径在$(mapred.local.dir)/taskTracker/archive/下保持不变。然后会为启动该Task对应的JVM进程配置运行环境和参数。最后会通过Java程序来调用系统命令,即启动一个JVM进程来执行该Task,关于如何使用Java程序来调用系统命令请参看我转载的系列文章:Java调用系统命令学习。最后这个调用交给了ShellCommandExecutor来运行,还是举个例子来说明这个调用形式:

bash-c "echo $$ > /home/xhh/workspace/Java/HMapred/build/test/mapred/task/local/taskTracker/jobcache/job_201112121911_0001/attempt_201112121911_0001_m_000003_0/pid ;exec'/opt/jdk1.6.0/jre/bin/java' '-Djava.library.path=/opt/jdk1.6.0/jre/lib/i386/server:/opt/jdk1.6.0/jre/lib/i386:/opt/jdk1.6.0/jre/../lib/i386:/opt/jdk1.6.0/jre/lib/i386/client:/opt/jdk1.6.0/jre/lib/i386::/usr/java/packages/lib/i386:/lib:/usr/lib:/home/xhh/workspace/Java/HMapred/build/test/mapred/task/local/taskTracker/jobcache/job_201112121911_0001/attempt_201112121911_0001_m_000003_0/work' '-Xmx200m' '-Djava.io.tmpdir=/home/xhh/workspace/Java/HMapred/build/test/mapred/task/local/taskTracker/jobcache/job_201112121911_0001/attempt_201112121911_0001_m_000003_0/work/tmp' '-classpath''/home/xhh/workspace/Java/HMapred/bin:/home/xhh/workspace/Java/HMapred/lib/ant.jar:/home/xhh/workspace/Java/HMapred/lib/commons-cli-1.2.jar:/home/xhh/workspace/Java/HMapred/lib/commons-codec-1.3.jar:/home/xhh/workspace/Java/HMapred/lib/commons-el-1.0.jar:/home/xhh/workspace/Java/HMapred/lib/commons-httpclient-3.0.1.jar:/home/xhh/workspace/Java/HMapred/lib/commons-logging-1.0.4.jar:/home/xhh/workspace/Java/HMapred/lib/commons-logging-api-1.0.4.jar:/home/xhh/workspace/Java/HMapred/lib/commons-net-1.4.1.jar:/home/xhh/workspace/Java/HMapred/lib/core-3.1.1.jar:/home/xhh/workspace/Java/HMapred/lib/Hadoop-0.20.2-tools.jar:/home/xhh/workspace/Java/HMapred/lib/hsqldb-1.8.0.10.jar:/home/xhh/workspace/Java/HMapred/lib/hsqldb-1.8.0.10.LICENSE.txt:/home/xhh/workspace/Java/HMapred/lib/jasper-compiler-5.5.12.jar:/home/xhh/workspace/Java/HMapred/lib/jasper-runtime-5.5.12.jar:/home/xhh/workspace/Java/HMapred/lib/jets3t-0.6.1.jar:/home/xhh/workspace/Java/HMapred/lib/jetty-6.1.14.jar:/home/xhh/workspace/Java/HMapred/lib/jetty-util-6.1.14.jar:/home/xhh/workspace/Java/HMapred/lib/jsp-2.1.jar:/home/xhh/workspace/Java/HMapred/lib/jsp-api-2.1.jar:/home/xhh/workspace/Java/HMapred/lib/junit-3.8.1.jar:/home/xhh/workspace/Java/HMapred/lib/kfs-0.2.2.jar:/home/xhh/workspace/Java/HMapred/lib/kfs-0.2.LICENSE.txt:/home/xhh/workspace/Java/HMapred/lib/log4j-1.2.15.jar:/home/xhh/workspace/Java/HMapred/lib/mockito-all-1.8.0.jar:/home/xhh/workspace/Java/HMapred/lib/oro-2.0.8.jar:/home/xhh/workspace/Java/HMapred/lib/servlet-api-2.5-6.1.14.jar:/home/xhh/workspace/Java/HMapred/lib/slf4j-api-1.4.3.jar:/home/xhh/workspace/Java/HMapred/lib/slf4j-log4j12-1.4.3.jar:/home/xhh/workspace/Java/HMapred/lib/xmlenc-0.52.jar:/home/xhh/workspace/Java/HMapred/lib/hdfs.jar::/home/xhh/workspace/Java/HMapred/build/test/mapred/task/local/taskTracker/jobcache/job_201112121911_0001/jars/classes:/home/xhh/workspace/Java/HMapred/build/test/mapred/task/local/taskTracker/jobcache/job_201112121911_0001/jars:/home/xhh/workspace/Java/HMapred/build/test/mapred/task/local/taskTracker/archive/mapred-fs/home/xhh/workspace/Java/HMapred/build/test/mapred/job/system/job_201112121911_0001/libjars/ant1.jar:/home/xhh/workspace/Java/HMapred/build/test/mapred/task/local/taskTracker/archive/mapred-fs/home/xhh/workspace/Java/HMapred/build/test/mapred/job/system/job_201112121911_0001/libjars/ant.jar:/home/xhh/workspace/Java/HMapred/build/test/mapred/task/local/taskTracker/jobcache/job_201112121911_0001/attempt_201112121911_0001_m_000003_0/work' '-Dhadoop.log.dir=/home/xhh/workspace/Java/HMapred/build/test/mapred/task/log' '-Dhadoop.root.logger=INFO,TLA' '-Dhadoop.tasklog.taskid=attempt_201112121911_0001_m_000003_0' '-Dhadoop.tasklog.totalLogFileSize=0' 'org.apache.hadoop.mapred.Child''211.69.205.3' '50070' 'attempt_201112121911_0001_m_000003_0' '1443792525'  < /dev/null  1>> /home/xhh/workspace/Java/HMapred/build/test/mapred/task/log/userlogs/attempt_201112121911_0001_m_000003_0/stdout 2>> /home/xhh/workspace/Java/HMapred/build/test/mapred/task/log/userlogs/attempt_201112121911_0001_m_000003_0/stderr"

从这个调用系统的语句中我们可以归纳出这样的一个运行语句模式:java ***org.apache.hadoop.mapred.Child***,其中,***表示运行时所需要的一些JVM参数以及应用程序所依赖的第三方jar包和相应的配置参数;***表是应用程序运行时本身需要的一些输入参数。

(有兴趣的盆友可以详细的品味一下上面的类图和时序图,我是原图上传的,图若不清楚可以直接点击下载。同时,由于时间仓卒,若有错误的地方请及时辅正)0b1331709591d260c1c78e86d0c51c18.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ava实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),可运行高分资源 Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现
C语言是一种广泛使用的编程语言,它具有高效、灵活、可移植性强等特点,被广泛应用于操作系统、嵌入式系统、数据库、编译器等领域的开发。C语言的基本语法包括变量、数据类型、运算符、控制结构(如if语句、循环语句等)、函数、指针等。下面详细介绍C语言的基本概念和语法。 1. 变量和数据类型 在C语言中,变量用于存储数据,数据类型用于定义变量的类型和范围。C语言支持多种数据类型,包括基本数据类型(如int、float、char等)和复合数据类型(如结构体、联合等)。 2. 运算符 C语言中常用的运算符包括算术运算符(如+、、、/等)、关系运算符(如==、!=、、=、<、<=等)、逻辑运算符(如&&、||、!等)。此外,还有位运算符(如&、|、^等)和指针运算符(如、等)。 3. 控制结构 C语言中常用的控制结构包括if语句、循环语句(如for、while等)和switch语句。通过这些控制结构,可以实现程序的分支、循环和多路选择等功能。 4. 函数 函数是C语言中用于封装代码的单元,可以实现代码的复用和模块化。C语言中定义函数使用关键字“void”或返回值类型(如int、float等),并通过“{”和“}”括起来的代码块来实现函数的功能。 5. 指针 指针是C语言中用于存储变量地址的变量。通过指针,可以实现对内存的间接访问和修改。C语言中定义指针使用星号()符号,指向数组、字符串和结构体等数据结构时,还需要注意数组名和字符串常量的特殊性质。 6. 数组和字符串 数组是C语言中用于存储同类型数据的结构,可以通过索引访问和修改数组中的元素。字符串是C语言中用于存储文本数据的特殊类型,通常以字符串常量的形式出现,用双引号("...")括起来,末尾自动添加'\0'字符。 7. 结构体和联合 结构体和联合是C语言中用于存储不同类型数据的复合数据类型。结构体由多个成员组成,每个成员可以是不同的数据类型;联合由多个变量组成,它们共用同一块内存空间。通过结构体和联合,可以实现数据的封装和抽象。 8. 文件操作 C语言中通过文件操作函数(如fopen、fclose、fread、fwrite等)实现对文件的读写操作。文件操作函数通常返回文件指针,用于表示打开的文件。通过文件指针,可以进行文件的定位、读写等操作。 总之,C语言是一种功能强大、灵活高效的编程语言,广泛应用于各种领域。掌握C语言的基本语法和数据结构,可以为编程学习和实践打下坚实的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值