1.入口
在下面的作业提交入口中点入:
boolean result = job.waitForCompletion(true);
if (this.state == Job.JobState.DEFINE) {
this.submit();
}
确认状态后提交,这便是debug时的代码入口
2.状态
进入后由方法名称可知是确认任务的状态,状态是enmu类型,但为什么要确认,状态为何异常却不清楚,而且进入submit()之前经过了一次判断,什么会导致刚判断成功进入状态便改变了呢?
this.ensureState(Job.JobState.DEFINE);
3.兼容
进去看了看,从内容和方法名称判断应该是兼容过去的版本,先不关心
this.setUseNewAPI();
4.连接
说是连接,是由于方法名为connect()
this.connect();
if (this.cluster == null) {
this.cluster = (Cluster)this.ugi.doAs(new PrivilegedExceptionAction<Cluster>() {
public Cluster run() throws IOException, InterruptedException, ClassNotFoundException {
return new Cluster(Job.this.getConfiguration());
}
});
}
好吧,说是连接,其实应当是根据配置信息,来配置启动集群了,有意思的是,configuration原来就是那堆xml文件。
5.submitter
由于在mapper和下一行代码都打了断点,直接飞断点并没有飞到Mapper代码,说明这一行并不是业务实现核心逻辑,那么核心应当在下一句。
final JobSubmitter submitter = this.getJobSubmitter(this.cluster.getFileSystem(), this.cluster.getClient());
参数调用了两个方法一个创建并返回了一个fs对象,另一个返回client,进入多层发现:
JobSubmitter(FileSystem submitFs, ClientProtocol submitClient) throws IOException {
this.submitClient = submitClient;
this.jtFs = submitFs;
}
那么这一行应当只是设置了作业的提交“容器”,设置了客户端信息和文件系统信息,接下来的应当才是重点。