源码解析:
Job提交流程源码解析
waitForCompletion()
submit();
// 1建立连接
connect();
// 1)创建提交Job的代理
new Cluster(getConfiguration());
// (1)判断是本地运行环境还是yarn集群运行环境
initialize(jobTrackAddr, conf);
// 2 提交job
submitter.submitJobInternal(Job.this, cluster)
// 1)创建给集群提交数据的Stag路径
Path jobStagingArea = JobSubmissionFiles.getStagingDir(cluster, conf);
// 2)获取jobid ,并创建Job路径
JobID jobId = submitClient.getNewJobID();
// 3)拷贝jar包到集群
copyAndConfigureFiles(job, submitJobDir);
rUploader.uploadFiles(job, jobSubmitDir);
// 4)计算切片,生成切片规划文件
writeSplits(job, submitJobDir);
maps = writeNewSplits(job, jobSubmitDir);
input.getSplits(job);
// split计算公式
maxSize=Long.MaxValue
Math.max(minSize,Math.min(maxSize,blockSize))
// 5)向Stag路径写XML配置文件
writeConf(conf, submitJobFile);
conf.writeXml(out);
// 6)提交Job,返回提交状态
status = submitClient.submitJob(jobId, submitJobDir.toString(), job.getCredentials());
总结
CopyAndConfiguration():拷贝jar包
writeSplits():切片信息
writeConf():XML文件
Map
MapTask数量
MapTask数量由Split(切片)决定。
为什么推荐切片大小和block保持一致?
如下图,如果切片与block不一致,那么可能会导致一个MapTask需要从两个节点中读取文件,而导致需要网络传输,从而降低性能。