任务是由TaskTracker启动与本身隔离的JVM运行,所有任务的运行主类是Child,主类先初始化任务的路径,log参数后,然后根据不同的任务类型执行不同的操作。
TaskTracker在启动Child时传入的参数可见taskjvm.sh。启动时为Task初始化目录,task的目录在TaskTracker初始化的Job目录的下一级,为:/tmp/hadoop-<user>/mapred/local/taskTracker/<user>/jobcache/<jobID>/<taskId>,然后把TaskTacker在Job dir创建的job.xml拷贝到Task dir,因为child会添加一些该任务特有的参数到job.xml中。在Task dir下再创建Task work dir和Task tmp dir,目录名分别为work和tmp,作为task在运行任务时工作目录和临时目录用。
初始化完毕后,根据任务的类型分别启动setup,cleanup,Map或者Reduce任务。Child启动Map任务的类图如下:
Child根据任务的类型启动对应的MapTask任务还是ReduceTask,MapTask/ReduceTask再去加载由开发人员通过配置文件”mapred.map.runner.class”设置的任务执行类,默认为MapRunner类,开发人员必须要提供对Mapper类的实现用于完成Map业务的操作。Reduce的启动过程与Map的启动过程类似。Map任务通过配置” mapred.input.format.class”指定数据源读取的格式,默认实现为TextInputFormat类,该类还提供对数据源进行split的实现。通过设置” mapred.output.format.class”指定处理结果输出格式,默认实现为TextOutputFormat,key,value按照String格式输出到文件。
1 Setup
执行Job前第一步先执行Job Setup任务,Job Setup主要是执行一些Job的初始化工作,比如创建Job的output目录等。因此它可以按照Map,也可以按照Reduce类型任务执行。
2 Task Cleanup
主要是执行该Task的临时目录的清理等工作,比如清理该Job在hdfs output下的Task临时目录。Task Cleanup任务同样也可以按照Map和Reduce类型执行。
3 Job Cleanup
如果该Job执行成功,则在hdfs的output目录下,创建执行成功的标识文件。如果失败则删除output目录下的各个Task的临时目录。
无论执行成功还是失败,都执行删除该Job在Hdfs上的工作目录,默认为hdfs uri+根目录+user+"/.staging"。
4. Map
Map任务的执行较复杂,后续单独章节说明并源代码分析。
5. Reduce
Reduce任务的执行较复杂,后续单独章节说明并源代码分析。