1.进入job类源码
(1)、在提交job的位置打断点,然后右键提交
(2)、双击选中waitForCompletion,强制进入,就到了Job类里面
2.在Job类中打断点
1. 在submit();处打断点
2. 进入submit();
3. 在summit中打断点 以便于调试
3.1 ensureState(JobState.DEFINE);
判断Job的状态
3.2 setUseNewAPI();
处理新旧API兼容性问题
3.3 强制进入connect();
选择客户端:YARN或者本地
3.3.1 转到Cluster类中
3.3.2 在Cluster类中的初始化位置initialize(jobTrackAddr, conf);
打断点
3.3.3 进入初始化,然后就到了initProviderList();
是一个循环,然后选择当前的运行的客户端
0是YARN客户端
1是本地客户端
3.4 找到客户端后,向集群提供job相关信息
(submitJobInternal方法)
点击进入submitJobInternal方法job方法的核心
3.4.1 在submitJobInternal方法中打断点调试
3.4.2 理解执行原理
(1)验证Job输出路径
checkSpecs(job); //验证Job输出路径是否存在问题:有无输出路径或者输出路径是否重复,存在问题则抛出异常
(2)设置临时路径
用于后面存放切片信息,job的id,job运行需要的配置信息等
Path jobStagingArea = JobSubmissionFiles.getStagingDir(cluster, conf);
(3)生成Job的id,这个id具有唯一性
(4)拷贝Job相关配置信息
需注意:本地模式不提交jar包,集群模式会提交jar包
copyAndConfigureFiles(job, submitJobDir);
(5)获取Job路径
Path submitJobFile = JobSubmissionFiles.getJobConfPath(submitJobDir);
(6)切片以及切片信息存放(例如切片个数,切片大小等)
日志中的切片个数显示
(7)生成job运行所需要的配置文件(如果是集群模式,还有一个job的jar包)到临时路径
(8)客户端提交job信息
status = submitClient.submitJob
3.4.3 继续运行
(1)然后submitJobInternal方法中回到到Java类
(2)标记Job运行状态
(3)继续运行 回到第3步summit