// 1. 开始提交程序
boolean result = job.waitForCompletion(true);
// 2. 当Job运行状态为为DEFINE, 提交Job
if (state == JobState.DEFINE) {
submit();
}
// 3. 确保Job状态
ensureState(JobState.DEFINE);
// 4. 兼容新旧API
setUseNewAPI();
// 5. 创建一个连接, 判断是本地连接还是集群连接
connect();
// 5.1如若有集群的连接信息, connect()方法结束, 否则. 使用配置信息创建一个新的集群连接
if (cluster == null) {
cluster =
ugi.doAs(new PrivilegedExceptionAction<Cluster>() {
public Cluster run()
throws IOException, InterruptedException,
ClassNotFoundException {
return new Cluster(getConfiguration());
}
});
}
// 6 使用配置好的集群HDFS对象和客户端对象创建一个JobSubmitter
final JobSubmitter submitter =
getJobSubmitter(cluster.getFileSystem(), cluster.getClient());
//7 submitter.submitJobInternal(Job.this, cluster);
// 7.1 对输出的命名空间进行检查, 如果存在:
// 7.1.1 输出路径存在, 抛出路径存在异常
// 7.1.2 输出路=路径没有设置, 抛出路径未设置异常
checkSpecs(job);
// 7.2 构建建一个能放临时文件的Path对象.
fs.mkdirs(stagingArea, new FsPermission(JOB_DIR_PERMISSION));
// 7.3 得到一个唯一的JobID, 并设置
JobID jobId = submitClient.getNewJobID();
job.setJobID(jobId);
// 7.4 将7.2和7.3的路径组合起来形成一个新的临时文件存放目录
Path submitJobDir = new Path(jobStagingArea, jobId.toString());
// 7.4.1拷贝Jar包到集群, 本地模式无此步骤
copyAndConfigureFiles(job, submitJobDir);
rUploader.uploadFiles(job, jobSubmitDir);
// 7.4.2 进行文件输入切片, 下一节详细说
int maps = writeSplits(job, submitJobDir);
// 7.5 缓存相关设置
try {
xxx // 缓存相关
// 7.5.1 将配置文件写入到临时文件目录 submitJobDir 下
copyAndConfigureFiles(job, submitJobDir);
// 7.5.2 将Job配置文件写入到 submitJobDir
writeConf(conf, submitJobFile);
// 7.5.2.1 具体实现
FSDataOutputStream out =
FileSystem.create(jtFs, jobFile,
new FsPermission(JobSubmissionFiles.JOB_FILE_PERMISSION));
try {
conf.writeXml(out);
} finally {
out.close();
}
}
// 7.6 开始提交Job
status = submitClient.submitJob(
jobId, submitJobDir.toString(), job.getCredentials());
// 7.6.1 当提交方式为 LocalJobRunner
Job job = new Job(JobID.downgrade(jobid), jobSubmitDir);
job.job.setCredentials(credentials);
// 7.6.2 当提交方式为 YarnJobRunner, 将Job提交给 ResourceManager
ApplicationId applicationId =
resMgrDelegate.submitApplication(appContext);
// 7.7 监控任务状态
monitorAndPrintJob();
// 当执行成功 , 返回 isSuccessful()
Job提交流程源码
最新推荐文章于 2022-04-28 18:17:44 发布