MapReduce之提交job源码分析 FileInputFormat源码解析

MapReduce之提交job源码分析

job 提交流程源码详解

//runner 类中提交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);
		// 5)向 Stag 路径写 xml 配置文件
		writeConf(conf, submitJobFile);
		conf.writeXml(out);
		// 6)提交 job,返回提交状态
		status  =  submitClient.submitJob(jobId,  submitJobDir.toString(),
		job.getCredentials());

FileInputFormat源码解析(input.getSplits(job))

(1)找到你数据存储的目录。
(2)开始遍历处理(规划切片)目录下的每一个文件
(3)遍历第一个文件 ss.txt(300M)
		a)获取文件大小 fs.sizeOf(ss.txt);
		b)计算切片大小
		computeSliteSize(Math.max(minSize,Math.min(maxSize,blocksize)))=blocksize=128M
		c)默认情况下,切片大小=blocksize
		d)开始切,形成第 1 个切片:ss.txt—0:128M 第 2 个切片 ss.txt—128:256M 第 3个切片 ss.txt—256M:300M
		(每次切片时,都要判断切完剩下的部分是否大于块的 1.1 倍,不大于 1.1 倍就划分一块切片)
		e)将切片信息写到一个切片规划文件中
		f)整个切片的核心过程在 getSplit()方法中完成。
		g)数据切片只是在逻辑上对输入数据进行分片,并不会再磁盘上将其切分成分片进行存储。
		InputSplit 只记录了分片的元数据信息,比如起始位置、长度以及所在的节点列表等。
		h)注意:block 是 HDFS 物理上存储的数据,切片是对数据逻辑上的划分。
(4)提交切片规划文件到 yarn 上,yarn 上的 MrAppMaster 就可以根据切片规划文件计
算开启 maptask 个数。

本博客仅为博主学习总结,感谢各大网络平台的资料。蟹蟹!!

posted @ 2019-05-21 14:29  趣学程序  阅读(114)  评论(0编辑  收藏  举报