MapReduce(七): TaskTracker执行任务


1.  第一步检查JobTracker版本号与自身版本号是否一致,并且检查localStorage中配置的目录是否都能正常访问。

2.  第二步向JobTracker发送心跳,返回LaunchTaskAction,KillTaskAction,KillJobAction和CommitTaskAction。

3.  第三步开始运行任务,如果是LaunchTaskAction则把任务放到TaskLaunch线程中进行任务调度执行。如果该任务占用的slot数大于目前可使用的slot数,则一直等待直到已占用slot的任务完成后释放slot。

1)  第3.1步如果在该TaskTracker上执行任务的Job还未初始化,则先进行初始化,如果该Job正在初始化中,则等待初始化完成后再启动任务。

2)  把提交在hdfs上的jobToken文件拷贝到本地,提交在hdfs上的路径如下:hdfs://192.168.74.103:9000/tmp/hadoop-<user>/mapred/system/<jobId>/jobToken,拷贝到本地的目录如下:/tmp/hadoop-<user>/mapred/local/ttprivate/taskTracker/<user>/jobcache/<TaskId>/jobToken

3)  把提交在hdfs上的job.xml文件拷贝到本地,提交在hdfs上的路径如下:hdfs://192.168.74.103:9000/tmp/hadoop-<user>/mapred/staging/<user>/.staging/<jobId>/job.xml,拷贝到本地的目录如下:/tmp/hadoop-<user>/mapred/local/ttprivate/taskTracker/<user>/jobcache/<jobId>/job.xml

4)  把Job配置文件中通过"mapred.cache.files","mapred.cache.archives"指定的文件和文件包拷贝缓存到本地目录中,如果文件是public的(可以不同的job共同使用)拷贝到/tmp/hadoop-<user>/mapred/local/taskTracker/<随机数>目录,如果文件是private的(只能当前用户使用)拷贝到/tmp/hadoop-jack/mapred/local/taskTracker/<user>/目录,如果是archive文件则解压缩。拷贝到本地后,把本地的路径通过"mapred.cache.localFiles""mapred.cache.localArchives"设置到Job的配置文件中。

5)   创建本地Job工作目录

/tmp/hadoop-<user>/mapred/local/taskTracker/<user>

/tmp/hadoop-<user>/mapred/local/taskTracker/<user>/jobcache

/tmp/hadoop-<user>/mapred/local/taskTracker/<user>/distcache

/tmp/hadoop-<user>/mapred/local/taskTracker/<user>/jobcache/<jobId>

/tmp/hadoop-<user>/mapred/local/taskTracker/<user>/jobcache/<jobId>/work

创建log目录:/opt/mapreduce/hadoop-1.1.2/logs/userlogs/<jobId>

6)  把已经拷贝到本地的JobToken文件转移到/tmp/hadoop-<user>/mapred/local/taskTracker/<user>/jobcache/<jobId>/jobToken目录下

7)   把提交在hdfs上该Job的运行程序拷贝到本地目录,提交在hdfs上的文件在:hdfs://192.168.74.103:9000/tmp/hadoop-<user>/mapred/staging/<user>/.staging/<jobId>/job.jar,在提交任务时会自动把hdfs的jar包,通过”map.jar”设置在参数中,后续通过该参数获得hdfs路径。拷贝到本地的文件在:                                    /tmp/hadoop-<user>/mapred/local/taskTracker/<user>/jobcache/<JobId>/jars/job.jar,并且解压缩到父目录上,这样解压缩后如果jar包中存在子目录lib或者classes,在运行Child任务时会自动把子目录包路径设在classpath中。

8)  如果开启的调试,则JVM不能重用,每个JVM只能运行一个Task,设置JVM重用为1,否则根据用户设置的重用个数设置。

9)  把该任务的访问控制权限信息写到日志文件/opt/mapreduce/hadoop-1.1.2/logs/userlogs/<jobId>

10)把所有初始化过程产生的参数或者更新的参数,包括原有已下载的job.xml中的参数重新写到/tmp/hadoop-<user>/mapred/local/taskTracker/<user>/jobcache/<jobId>/job.xml,后续的运行Task使用该文件中的参数。

4.  3.1.2.1 启动TaskRunner线程准备好启动执行任务的环境参数

1)  生成本地Task work目录,该目录在job目录下。生成的目录例如:/tmp/hadoop-<user>/mapred/local/taskTracker/<user>/jobcache/<JobId>/<TaskId>/work

2)  生成classpath,classpath包含TaskTracker运行的classpath、Job jar解压缩后的目录、Task work目录、以及通过"mapred.cache.files"指定缓存到本地的文件。

3)  如果需要进行内存管理的,则检查运行任务的jvm内存是否超过最大值,超过最大值则设置任务失败,退出jvm。

4)  设置启动jvm的环境,有class path、library path、task tmpDir、profile参数、log4j参数、用户名、TaskTracker的ip地址、以及用户可以通过配置文件“mapred.child.java.opts”设置的参数。Library path为jdk的library path和Task work目录。

5)  生成启动jvm的日志文件

标准输出文件在:

/opt/mapreduce/hadoop-1.1.2/logs/userlogs/<jobId>/<tasked>/stderr

错误输出文件在:

/opt/mapreduce/hadoop-1.1.2/logs/userlogs/<jobId>/<tasked>/stderr

5.  3.1.2.1.1对该任务进行分配JVM,如果已有jvm在运行该任务则不分配,如果已有jvm分配该任务,但该任务已经执行完毕则先kill该jvm。

6.  3.1.2.1.1.1启动JvmRunner,开始启动jvm运行任务。先把生成的环境参数写入到文件:/tmp/hadoop-<user>/mapred/local/ttprivate/taskTracker/<user>/jobcache/<JobId>/<TaskId>/taskjvm.sh,然后执行该文件。

7.  执行完毕后kill jvm,并且把分配给该Task的Jvm信息删除。

 

在启动任务后,需要定时上报任务执行状态,TaskTracker在所设置的时间内没有收到Task的任务状态,则把该任务置为失败,移除任务信息并且kill该任务的Jvm。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值