Hadoop的作业提交过程

1.JobClient调用FileInputFormat.getSplits(),如果数据文件是isSplitable()的话,会将大的文件分解成小的FileSplit,记录文件
在HDFS里的路径及偏移量和Split大小。这些信息会统一打包到jobFile的jar中。
2.JobClient然后使用submitJob(job)方法向master提交作业。submitJob(job)内部是通过submitJobInternal(job)方法完成实质性的作业提交。 submitJobInternal(job)方法首先会向hadoop分布系统文件系统hdfs依次上传三个文件: job.jar, job.split和job.xml。
job.xml: 作业配置,例如Mapper,Combiner, Reducer的类型,输入输出格式的类型等。
job.jar: jar包,里面包含了执行此任务需要的各种类,比如 Mapper,Reducer等实现。
job.split: 文件分块的相关信息,比如有数据分多少个块,块的大小(默认64m)等。
这三个文件在hdfs上的路径由hadoop-default.xml文件中的mapreduce系统路径mapred.system.dir属性+jobid决定。mapred.system.dir属性默认是/tmp/hadoop-user_name/mapred/system。写完这三个文件之后,此方法会通过RPC调用master节点上的JobTracker.submitJob(job)方法,此时作业已经提交完成。

3.JobTracker会根据从HDFS获取的Job的Split信息(job.split,job.splitMetaInfo文件)生成对应的Map输入数据数组JobSplit.TaskSplitMetaInfo[],用于对map任务进行初始化(在createSplits中)。TaskSplitMetainfo中保存的TaskSplitIndex指明了该split在job.split文件中的位置(即1:job.split在TT本地的目录,2,该split信息在job.split文件中的偏移量)。


4.在TT开始执行任务前,会首先从HDFS中将job.split,job.jar等文件拷贝到本地(copyToLocal), 从JT端收到任务指令后,其中包括这个
TaskSplitIndex,其根据TaskSplitIndex从job.split中读取InputSplit信息,开始执行任务。



job.split存放所有分片信息, job.splitmetainfo存放所有分片的元数据信息

你可能感兴趣的:(hadoop)