一. InputFormat 数据输入
1. 数据切片与MapTask并行度决定机制
1. 数据切片
数据块:Block是HDFS物理上把数据分成一块一块。
数据切片:数据切片只是在逻辑上对输入进行分片。
2. MapTask并行度决定机制
- 一个Job的Map阶段并行度由客户端在提交Job时的切片数决定
- 每一个Split切片分配一个MapTask并行实例处理
- 默认情况下,切片大小 = BlockSize = 128M
4)切片时不考虑数据集整体,而是逐个针对每一个文件单独切片
2. Job提交流程源码和切片源码详解
1. 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());
2. FileInputFormat切片源码解析(input.getSplits(job))
- 示意图
- 程序先找到你数据存储的目录。
(2)开始遍历处理(规划切片)目录下的每一个文件
(3)历第一个文件s.txt a)获取文件大小6.sizeOff5s.txt)b)计切片大小
computeS plitsize(M ath rmaxd mind ize,Matlhrmin(rmaxs ize,blocksize)))=blocksize=128M c)默认情况下,切片大小=blocksize d)开始切,形成第1个切片:ss.txt-0:128M第2个切片5s.txt-128:256M第3个切片ss.txt-256M:300M
(每次切片时,都要判断切完剩下的部分是否大于块的11倍,不大于11倍就划分一块切片)e)将切片信息写到一个切片规划文件中
f)整个切片的核心过程在getSpli()方法中完成
g)Imputpt只记录了切片的元数据信息,比如起始位置、长度以及所在的节点列等。
(4)提交切片规划文件到YARN上,YARN上的MrAppMaster就可以根据切片规划文件计开后MapTask个数。