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的配置文件中。
/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。