今天自己研究hadoop MapReduce 代码,写出来方面以后查阅吧。我研究源代码从main()方法的waitForCompletion()开始研究。
waitForCompletion()主要作用是Submit the job to the cluster and wait for it to finish.job的运行状态有如下几种方式:
- NEW
- INITED,
- RUNNING,
- SUCCEEDED,
- FAILED,
- KILLED,
- ERROR
判断完job状态后将提交任务给集群。 submit()负责提交任务给集群,我们主要详细分析submit()方法实现过程。
- 判断job状态;
- 使用新的API兼容前面的MapReduce API;
- 链接集群 使用connect()方法;
- 生成一个submitter对象,负责提交job任务;
- 调用submitter的内部方法submitJobInternal提交任务;
- 调用submitter的内部方法submitJobInternal提交任务;
-
submitJobInternal主要实现了如下功能:
- 检查输入输出规格;
- 计算输入分块信息;
- 设置分发任务的用户信息;
- 拷贝job的jar、配置信息到mapreduce的目录(在hdfs上面);
- 提交任务给job 给jobtracker并监控他们的状态;
- 提交任务是使用的submitClient,中的submitJob,需要三个参数:jobiD,submitJobDir,Credentials(安全认证方法);调用YARNRunner类下的submitJob()函数,提交Job,传出相应的所需参数(例如 JobID等)。
- ClientProtocol 是客户端与jobtracker的通信协议;
- 提交任务完成
YARNRunner 任务提交代码如下:
@Override
public JobStatus submitJob(JobID jobId, String jobSubmitDir, Credentials ts)
throws IOException, InterruptedException {
addHistoryToken(ts);
// Construct necessary information to start the MR AM
ApplicationSubmissionContext appContext =
createApplicationSubmissionContext(conf, jobSubmitDir, ts);
// Submit to ResourceManager
try {
ApplicationId applicationId =
resMgrDelegate.submitApplication(appContext);
ApplicationReport appMaster = resMgrDelegate
.getApplicationReport(applicationId);
String diagnostics =
(appMaster == null ?
"application report is null" : appMaster.getDiagnostics());
if (appMaster == null
|| appMaster.getYarnApplicationState() == YarnApplicationState.FAILED
|| appMaster.getYarnApplicationState() == YarnApplicationState.KILLED) {
throw new IOException("Failed to run job : " +
diagnostics);
}
return clientCache.getClient(jobId).getJobStatus(jobId);
} catch (YarnException e) {
throw new IOException(e);
}
}
- 设置必要的配置信息,初始化Application上下文信息,其中上下文信息中包括MRAppMaster所需要的资源,执行MRAppMaster的命令得等。
- 然后调用ResourceMgrDelegate的submitApplication()方法,同时传入Application上下文信息,提交Job到ResourceManager,函数执行最后返回已生成的ApplicationId(实际生成JobID的时候ApplicationId就已经生成)。
- 最后返回Job此时的状态,函数退出
需要继续了解split和RPC通信协议。