MapReduce的一个子Task的启动过程

首先,每一个mapreduce任务被分配到了某一个TaskTracker后,都会以一个新的进程的方式启动。

1)TaskTracker的Child内部类是每一个运行的子task的main类

2)TaskTracker的lauchTask是TaskTracker启动一个子Task的入口函数

3)TaskTracker的lauchTask通过Task(MapTask/ReduceTask)的createRunner方法得到一个TaskRunner对象(MapTaskRunner/ReduceTaskRunner)。TaskRunner是一个新的线程。通过启动这个新的启动线程来启动Task

    启动的过程是:1.localizeCache    2.设置子java进程的calsspath,和一些环境变量,设置log4j,然后将子java进程的主类设

    置成TaskTracker的Child,然后将子Task的id作为其中的一个参数

4)在程序里面运行一个shell命令 启动子task的java进程

5)TaskTracker的Child启动后,TaskTracker的Child的main方法通过从参数获取的taskid向TaskTracker索取Task对象(MapTask,ReduceTask),然后运行获得的Task的run方法。

6)Task的run方法首先会启动一个和TaskTracker通信的线程来报道进展情况,以及查看TaskTracker是不是重新启动过或者已经死掉了,如果TaskTracker是不是重新启动过或者已经死掉了,子java进程就直接退出。

7)运行MapRunner或者ReduceRunner的run方法。

 

 好绕啊。。。。佩服写这代码的人。由衷的佩服高智商。。。

你可能感兴趣的:(java,mapreduce,log4j,shell,任务)