一、流程分析图
二 、代码跟进
waitForCompletion(){
submit()}
------>
class job{
private Cluster cluster;
submit(){
connect(){
cluser = new Cluster(getConfiguration() //持有Client的引用,作为job的成员变量
}
JobSubmitter submitter = getJobSubmitter(cluster.getFileSystem(), cluster.getClient()) //cluster.getClient()得到Cluster中的client成员变量,
//而client中具有RPCserver的代理对象的引用,所以submitter是一个可以连接RPCserver的提交器
submitter.submitJobInternal(Job.this, cluser)
}
}
------>
Cluster{
private ClientProtocol client;
public Cluster(InetSocketAddress jobTrackAddr, Configuration conf){
this.initialize(jobTrackAddr, conf);
}
initialize(){
client = private ClientProtocol //得到RPCserver(即ResourceManager)的代理对象,作为Cluster的成员变量
}
}
------>
submitter.submitJobInternal(Job, cluser){
Path jobStagingArea = JobSubmissionFiles.getStagingDir(cluster, conf); //得到ResourceManager发送的路径
JobID jobId = this.submitClient.getNewJobID(); //得到ResourceManager发送的JobId
Path submitJobDir = new Path(jobStagingArea, jobId.toString()); //将得到的路径作为前缀和JobId作为后缀,拼成一个新的路径
copyAndConfigureFiles(job, submitJobDir); //上传jar包
int maps = writeSplits(job, submitJobDir); //获取切片信息
writeConf(conf, submitJobFile); //写描述文件xml
}