hadoop源码阅读(二)(Job提交源码)

1 本地提交

运行Job处打断点

在这里插入图片描述

F7进入waitForCompletion方法

在这里插入图片描述

JobState有DEFINERUNNING两个枚举类型(ctrl+左键进入)

在这里插入图片描述

走DEFINE,F8走到submit方法F7进入

在这里插入图片描述

在submit方法中再次确认Job状态,设置使用新的API为了将旧的API替换为新的API(兼容性)

在这里插入图片描述

connect是建立连接的方法

在这里插入图片描述

查看连接集群的方法

在这里插入图片描述

集群为空

在这里插入图片描述

		//判断是本地yarn还是远程
		//本地会创建LocalJobRunner对象
		//远程(集群)会创建YarnRunner对象
		initialize(jobTrackAddr, conf); 

在这里插入图片描述

其他方法不看,直接看这个创建Job对象的方法

在这里插入图片描述

这里Configuration对象.get的方法就是我们在Driver中set配置的参数

如果这里在Driver设置了conf.set(“map reduce.framework.name”,“yarn”)则返回的是集群模式
看完这个方法F8出来

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

Local本地模式返回的LocalJobRunner
ClientProtocol clientProtocol客户端协议则指向new出来的LocalJobRunner对象

在这里插入图片描述

一直出来整个connet方法结束,进入到这个job提交的方法

//提交job
submitter.submitJobInternal(Job.this, cluster)

在这里插入图片描述

进入

在这里插入图片描述

继续进入output.checkOutputSpecs(job);这个是检查output的方法

在这里插入图片描述

看完checkSpeck(job)方法,出去到方法外

	//创建给集群提交数据的Stag路径
	//这里进的是本地的Stag路径
	Path jobStagingArea = JobSubmissionFiles.getStagingDir(cluster, conf);

进入这个方法中

在这里插入图片描述
在这里插入图片描述

在Mac本地中会创建一个jobstag路径

在这里插入图片描述

此时还没有生成数据文件

在这里插入图片描述

获取JobID的方法

// 获取jobid ,并创建Job路径
	JobID jobId = submitClient.getNewJobID();

// 内部详细代码(了解)
public synchronized org.apache.hadoop.mapreduce.JobID getNewJobID() {
        return new org.apache.hadoop.mapreduce.JobID("local" + this.randid, ++jobid);
    }

在这里插入图片描述

在这里插入图片描述

本地的话是不会走这个方法的copyAndConfigureFiles(job, submitJobDir); 集群走这个方法会上传一个jar包

在这里插入图片描述

进入writeSplits的方法

// 计算切片,生成切片规划文件
writeSplits(job, submitJobDir);
		maps = writeNewSplits(job, jobSubmitDir);
		input.getSplits(job);

// 方法内
// 通过ReflectionUtils(反射的工具类)去创建实例对象(TextInputFormat对象),默认的InputFormat>>TextInputFormat中重写了getSplits的切片方法
InputFormat<?,?> input = ReflectionUtils.newInstance(job.getInputFormatClass(),conf);
// TextInputformat对象调用父类(FileInputFormat)的getSplits方法[这句话有点难懂解释一下,TextInputFormat中是没有getSplits方法的,它的父类重写了InputFormat的getSplits方法,TextInputFormat只重写了InputFormat的createRecordReader方法,实在还是不懂的话可以看看我上一篇源码把思路捋清楚再继续走]
List<InputSplit> splits = input.getSplits(job);

在这里插入图片描述

writeSplits方法执行完本地会会创建一个jobStag路径

// 向Stag路径写XML配置文件(同jobStag原理,在同样的路径生成job.xml文件)
writeConf(conf, submitJobFile);
	conf.writeXml(out);
// 提交Job(LocalJobRunner对象),返回提交状态
// job提交流程结束后本地jobStag路径中清空文件
status = submitClient.submitJob(jobId, submitJobDir.toString(), job.getCredentials());

在这里插入图片描述

上面说到的两个方法,多自己跑两次思路会很清晰

2 集群提交模式

集群提交模式前提是在集群上运行再debug,集群要开,设置配置要先调好

差异处:submitJobInternal

//这里进入的时候会进入到YarnClientProtocolProvider类中(本地是进入到的是LocalClientProtocolProvider类)
if (jobTrackAddr == null) {
          clientProtocol = provider.create(conf);
        } else {
          clientProtocol = provider.create(jobTrackAddr, conf);
        }

//由于我们配置了mapreduce.framework.name,所以能进入YARNRunner(conf)这个方法
public ClientProtocol create(Configuration conf) throws IOException {
        return "yarn".equals(conf.get("mapreduce.framework.name")) ? new YARNRunner(conf) : null;
    }

所以此时会创建出一个YARNRunner对象
connect方法执行完毕,走进提交job代码

return submitter.submitJobInternal(Job.this, cluster);

// 创建给集群提交数据的Stag路径
	Path jobStagingArea = JobSubmissionFiles.getStagingDir(cluster, conf);

// 获取jobid ,并创建Job路径
	JobID jobId = submitClient.getNewJobID();

// 拷贝jar包到集群
copyAndConfigureFiles(job, submitJobDir);	
	rUploader.uploadFiles(job, jobSubmitDir);

// 计算切片,生成切片规划文件,向Stag路径写XML配置文件


3 总结

请添加图片描述

集群类似,有空再画,已经肝不动了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值