作业提交对应上图的第4个步骤。作业提交的实现类是JobSubmitter,其中函数submitJobInternal实现的,它的主要工作是:1)检查输入、输出目录;2)计算输入的文件块;3)准备DistributeCache相关信息。4)拷贝作业的jar文件和配置到文件系统。5)提交作业给JobTracker,并开始监控作业的状态。
代码如下:
其中,代码:
status = submitClient.submitJob(jobId, submitJobDir.toString(),TokenCache.getTokenStorage());
是通过RPC将相关文件信息传递到JobTracker。
现在,JobTracker的哪一部分代码体现了接收信息的呢?这个问题困扰了我很久。JobTracker里的submitJob()函数,该函数中接收提交的任务:创建一个JobInProgress对象,包含作业描述信息(JobProfile)和作业状态信息(JobStatus)。得到作业id和JobInProgress后便将这两个对象提交给JobTracker。在submitJob()的最后一句代码:
return addJob(jobId,job);
是作业提交的核心所在。addJob()函数的代码如下:
上述代码中的for循环的主要是给jobTracker的各种监听器添加这个job。例如,对于作业调度里会有一个JobInProgressListener来监听提交的作业,进而根据调度算法进行任务分配。