一、切片与MapTask并行度决定机制
1. 数据块
Blocak是HDFS物理上把数据分为一块一块的,数据块是HDFS存储数据的单位
2. 数据切片
数据切片只是在逻辑上对输入进行分片,并不会在磁盘上将其切分成片进行存储,数据切片是MapReduce程序计算输入数据的单位,一个切片会对应启动一个MapTask
3. 说明
<1>一个Job的Map阶段并行度由客户端在提交Job时的切片数决定 <2>每一个Split切片分配一个MapTask并行实例处理 <3>默认情况下,切片大小=BlockSize <4>切片时不考虑数据集整体,而是逐个针对每一个文件单独切片
二、Job提交流程源码和切片源码
1. Job提交流程源码详解
waitForCompletion()
submit();
connect();
new Cluster(getConfiguration());
initialize(jobTrackAddr, conf);
submitter.submitJobInternal(Job.this, cluster)
Path jobStagingArea = JobSubmissionFiles.getStagingDir(cluster, conf);
JobID jobId = submitClient.getNewJobID();
copyAndConfigureFiles(job, submitJobDir);
rUploader.uploadFiles(job, jobSubmitDir);
writeSplits(job, submitJobDir);
maps = writeNewSplits(job, jobSubmitDir);
input.getSplits(job);
writeConf(conf, submitJobFile);
conf.writeXml(out);
status = submitClient.submitJob(jobId, submitJobDir.toString(), job.getCredentials());
![在这里插入图片描述](https://img-blog.csdnimg.cn/a72659736ed9437db64d49bbe5eab8e7.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6LaF6LaK5qKm5oOzX0c=,size_20,color_FFFFFF,t_70,g_se,x_16)
2. 切片源码详解
<1>先找到数据存储目录
![在这里插入图片描述](https://img-blog.csdnimg.cn/509b8f0d6c7c4226a55686b3bceb69b1.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6LaF6LaK5qKm5oOzX0c=,size_16,color_FFFFFF,t_70,g_se,x_16)
<2>遍历目录下的每一个文件
![在这里插入图片描述](https://img-blog.csdnimg.cn/286b5720a0d848278be25be5e3115eb7.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6LaF6LaK5qKm5oOzX0c=,size_16,color_FFFFFF,t_70,g_se,x_16)
<3>切片
- 获取文件大小fs.size(ss.txt)
![在这里插入图片描述](https://img-blog.csdnimg.cn/8c9cd6052a5e488da649c8ec230df5c6.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6LaF6LaK5qKm5oOzX0c=,size_14,color_FFFFFF,t_70,g_se,x_16) - 计算切片
默认情况下,切片大小等于BlockSize ![在这里插入图片描述](https://img-blog.csdnimg.cn/ad5e1b86e311431a8ee8bf7999f1c2fa.png) ![在这里插入图片描述](https://img-blog.csdnimg.cn/b440822f709d4ffbb2ee8a64d8aeef6d.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6LaF6LaK5qKm5oOzX0c=,size_16,color_FFFFFF,t_70,g_se,x_16) ![在这里插入图片描述](https://img-blog.csdnimg.cn/8247e00e04014ac4a0fa3c4b2d6f519b.png) - 开始切片,每次切片时,都要判断切完剩下的部分是否大于块的1.1倍,不大于1.1倍就划分为一个块切片。
![在这里插入图片描述](https://img-blog.csdnimg.cn/3230a9b4cc6c4bb8a0b48624297f1ae2.png) - 将切片信息写道一个切片规划文件中
![在这里插入图片描述](https://img-blog.csdnimg.cn/5cfc81ef190f4bf8afcfe410cafed730.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6LaF6LaK5qKm5oOzX0c=,size_16,color_FFFFFF,t_70,g_se,x_16) - 整个切片的核心过程在getSplit()方法中完成
- InputSplit只记录了切片的元数据信息,比如起始位置,长度以及所在节点列表等
<4>提交切片规划文件到YARN
YARN上的MrAppMaster就根据切片规划文件计算开启MapTask个数
三、FileInputFormat切片大小参数配置
1. 源码切片大小计算
![在这里插入图片描述](https://img-blog.csdnimg.cn/03c55c34f87e4895a237a0a11af0755d.png) ![在这里插入图片描述](https://img-blog.csdnimg.cn/2bc126aee46047c88f2ebffcaf68844b.png) ![在这里插入图片描述](https://img-blog.csdnimg.cn/6ebc5163cc4e4cd7840a915c59de99be.png) ![在这里插入图片描述](https://img-blog.csdnimg.cn/0c84213beef2444ea0c3dd973a96f050.png) ![在这里插入图片描述](https://img-blog.csdnimg.cn/5303e38b3b5440f889524c6b9579b45c.png) ![在这里插入图片描述](https://img-blog.csdnimg.cn/d689a76e8f654b1bb731d37ea068fcc6.png) ![在这里插入图片描述](https://img-blog.csdnimg.cn/e1ec9785d4b34c03b712bed39c3823cb.png) ![在这里插入图片描述](https://img-blog.csdnimg.cn/690d785dfe17405d9367742abd6b7020.png) ![在这里插入图片描述](https://img-blog.csdnimg.cn/f72da2bd61b74726b228b9264367e05b.png)
2. 切片大小设置
![在这里插入图片描述](https://img-blog.csdnimg.cn/9938e934174c4dff909e1c39003779f2.png)
3. 获取切片信息API
![在这里插入图片描述](https://img-blog.csdnimg.cn/1fbd18879258409689753cd234d901c2.png)
四、TextInputFormat
- 是FileInputFormat的默认实现类
- 按照行读取每条记录
- key是整个文件的起始字节偏移量,LongWritable类型,value是这行的内容,不包括任何终止符(换行符,回车符),Text类型
![在这里插入图片描述](https://img-blog.csdnimg.cn/491cbdaf679841869ca0e18436b71c9a.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6LaF6LaK5qKm5oOzX0c=,size_16,color_FFFFFF,t_70,g_se,x_16)
五、CombineTextInputFormat
1. 继承关系
![在这里插入图片描述](https://img-blog.csdnimg.cn/fcd1f835622e497588a3020ea77b194a.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6LaF6LaK5qKm5oOzX0c=,size_16,color_FFFFFF,t_70,g_se,x_16)
2. 应用场景
默认TextInputFormat切片机制是对任务按文件规划切片,不管文件多小,都会是一个单独切片,都会交给一个MapTask,这样如果有大量小文件,就会产生大量MapTask,效率变低 因此,CombineTextFormat适合用于小文件过多的场景,它可以将多个小文件从逻辑上规划到一个切片中,这样,多个小文件就可以交给一个MapTask处理
3. 虚拟存储切片最大值设置
![在这里插入图片描述](https://img-blog.csdnimg.cn/d78d927e48774feb9f1ef1e347be0904.png)
4. 虚拟存储过程
![在这里插入图片描述](https://img-blog.csdnimg.cn/14ed414f84b44382be236d2dc859d2f4.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6LaF6LaK5qKm5oOzX0c=,size_16,color_FFFFFF,t_70,g_se,x_16)
5. 切片机制
<1>判单虚拟存储的文件大小是否大于setMaxInputSplitSize值,大于等于则单独形成一个切片 <2>如果不大于则更下一个虚拟存储文件进行合并,共同形成一个切片。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/86a2de471e98430088585191b0cc7cdb.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6LaF6LaK5qKm5oOzX0c=,size_16,color_FFFFFF,t_70,g_se,x_16)
六、 CombineTextInputFormat案例
1. 准备四个文件,并修改输入路径
采用之前的wordCount案例,可查看之前的博客 ![在这里插入图片描述](https://img-blog.csdnimg.cn/379549fcddc44568bc8148f36e9ebf53.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6LaF6LaK5qKm5oOzX0c=,size_20,color_FFFFFF,t_70,g_se,x_16)
2. 在不修改的情况下,运行结果
采用TextInputFormat分片方式,分为了四个切片,调用了四个MapTask ![在这里插入图片描述](https://img-blog.csdnimg.cn/5bbcd784b20340e1aec7065e799f93a2.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6LaF6LaK5qKm5oOzX0c=,size_19,color_FFFFFF,t_70,g_se,x_16)
3. 在WordCountDriver中添加以下代码
添加代码
job.setInputFormatClass(CombineTextInputFormat.class);
CombineTextInputFormat.setMaxInputSplitSize(job, 4194304);
![在这里插入图片描述](https://img-blog.csdnimg.cn/63ae58150f5347d2b893dfd771d39c6b.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6LaF6LaK5qKm5oOzX0c=,size_20,color_FFFFFF,t_70,g_se,x_16)
运行结果
分为了三个切片,调用了三个MapTask ![在这里插入图片描述](https://img-blog.csdnimg.cn/2241324570c94707992c3052bab9d837.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6LaF6LaK5qKm5oOzX0c=,size_20,color_FFFFFF,t_70,g_se,x_16)
4. 修改虚拟存储切片的最大值
修改代码
![在这里插入图片描述](https://img-blog.csdnimg.cn/da9331f5ecf2479f86d537a060f630c2.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6LaF6LaK5qKm5oOzX0c=,size_20,color_FFFFFF,t_70,g_se,x_16)
运行结果
分为了一个切片,调用了一个MapTask ![在这里插入图片描述](https://img-blog.csdnimg.cn/ee8e53ce69834852b2a3339d25f0c32c.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6LaF6LaK5qKm5oOzX0c=,size_20,color_FFFFFF,t_70,g_se,x_16)
|