FileInputFormat切片源码解析
文章目录
- FileInputFormat切片源码解析
- 1、MapTask并行度决定机制
- 2、源码步骤
- 3、FileInputFormat切片机制
- 3.1 源代码中计算切片大小的公式
- 3.2 获取切片信息API
- 4、FileInputFormat的实现类
- 4.1 TextInputFormat
- 4.2 CombineTextInputFormat切片机制
- 5、代码验证
FileInputFormat切片源码解析
在提交任务过程中,我们需要对数据进行逻辑上的切片,对应代码为input.getSplits(job)
1、MapTask并行度决定机制
数据块:Block是HDFS物理上把数据分成一块一块。数据块是HDFS存储数据单位。
数据切片:数据切片只是在逻辑上对输入进行分片,并不会在磁盘上将其切分成片进行存储。数据切片是MapReduce程序计算输入数据的单位,一个切片会对应启动一个MapTask。
- 一个Job的Map阶段你并行度由客户端在提交Job时的切片数决定;
- 每个Split切片分配一个MapTask并行实例处理;
- 默认情况下,切片大小=块大小;
- 切片时不考虑数据集整体,而是逐个针对每个文件单独切片
注意: 在任务提交过程中,先按文件大小排序,然后先切大文件后切小文件。
2、源码步骤
程序先找到数据存储的目录;
开始遍历处理目录下的每个文件;
获取文件大小:fs.sizeOf(ss.txt);
计算切片大小:computeSplitSize(minSize,Math.min(maxSize,blockSize))
blockSize=128M
每次切片时,都要判断切完剩下的部分是否大于块的1.1倍,不大于1.1倍就划分为一个切片
将切片信息写到一个切片规划文件中
整个切片的核心过程在getSplit()方法中完成
InputSplit只记录切片的元数据信息,如起始位置、长度以及节点列表等。
提交切片规划文件到Yarn上,Yarn上的MrAppMaster就可以根据切片规划文件计算MapTask个数。
3、FileInputFormat切片机制
- 按照文件内容长度进行切片
- 默认切片大小等于Block大小
- 切片时不考虑数据集整体,而是逐个针对每个文件单独切片
案例:
3.1 源代码中计算切片大小的公式
computeSplitSize(minSize,Math.min(maxSize,blockSize))
minSize默认为1
maxSize默认为Long.MAXValue
因此,默认情况切片大小=Block大小=128M
maxSize可以调整切片的最大值:如果比blockSize小,则会让切片变小;
minSize可以调整切片的最小值:如果比blockSize大,则会让切片变大;
3.2 获取切片信息API
//获取切片的文件名称
String name = inputSplit.getPath().getName();
//根据文件类型获取切片信息
FileSplit inputSplit = (FileSplit)context.getInputSplit();
4、FileInputFormat的实现类
FileInputFormat常见的接口实现类包括:TextInputFormat、KeyValueTextInputFormat、NLineInputFormat、CombineTextInputFormat和自定义InputFormat等。
4.1 TextInputFormat
TextInputFormat是默认的FileInputFormat实现类。按行读取每条记录。键是存储该行在整个文件中的起始字节偏移量, LongWritable类型。值是这行的内容,不包括任何行终止符(换行符和回车符),Text类型。
4.2 CombineTextInputFormat切片机制
缘由:框架默认的TextInputFormat切片机制是对任务按文件规划切片,不管文件多小,都会是一个单独的切片,都会交给一个MapTask,这样如果有大量小文件,就会产生大量的MapTask,处理效率极其低下。
应用场景:小文件过多的场景,它可以将多个小文件从逻辑上规划到一个切片中,这样,多个小文件就可以交给一个MapTask处理。
虚拟存储切片最大值设置:
CombineTextInputFormat.setMaxInputSplitSize(job, 4194304);// 4m
切片机制:虚拟存储过程+切片过程
虚拟存储过程:
将输入目录下所有文件大小,依次和设置的setMaxInputSplitSize值比较,如果不大于设置的最大值,逻辑上划分一个块。如果输入文件大于设置的最大值且大于两倍,那么以最大值切割一块;当剩余数据大小超过设置的最大值且不大于最大值2倍,此时将文件均分成2个虚拟存储块(防止出现太小切片)。
例如setMaxInputSplitSize值为4M,输入文件大小为8.02M,则先逻辑上分成一个4M。剩余的大小为4.02M,如果按照4M逻辑划分,就会出现0.02M的小的虚拟存储文件,所以将剩余的4.02M文件切分成(2.01M和2.01M)两个文件。
切片过程:
判断虚拟存储的文件大小是否大于setMaxInputSplitSize值,大于等于则单独形成一个切片;
如果不大于则跟下一个虚拟存储文件进行合并,共同形成一个切片;
5、代码验证
在wordcount的基础上准备四个小文件进行测试
未改动前:切片为4;
Driver中添加代码:
//如果不设置InputFormat,它默认用的是TextInputFormat.class
job.setInputFormatClass(CombineTextInputFormat.class);
//虚拟存储切片最大值设置4m
CombineTextInputFormat.setMaxInputSplitSize(job, 4194304);
切片为3;
- Driver中添加代码:
// 如果不设置InputFormat,它默认用的是TextInputFormat.class
job.setInputFormatClass(CombineTextInputFormat.class);//虚拟存储切片最大值设置20m
CombineTextInputFormat.setMaxInputSplitSize(job, 20971520);
切片为1;
FileInputFormat切片源码解析相关推荐
- 十六、FileInputFormat介绍,切片源码分析
一.InputFormat介绍 InputFormat,从单词意思解读分为输入.格式,也就是数据来源与加载数据的方式是决定MR编程的map阶段的任务并行度. 数据来源划分:其实也就是他的子类,由于我目 ...
- Hadoop MapReduce Splits 切片源码分析及切片机制
本文从Job提交,逐步分析Splits相关源码. 数据块:Block是HDFS物理上把数据分成一块一块的. 数据切片:数据切片只是在物理上输入进行分片,并不会在磁盘上将其分成片进行存储. 文件路径 o ...
- 大数据之-Hadoop3.x_MapReduce_切片源码总结---大数据之hadoop3.x工作笔记0105
可以看到我们分析完,切片的源码,然后总结一下hadoop3.x的MapReduce的切片 过程 首先要知道切片这个过程是在InputFormat这个类中进行的 我们在InputFormat上按下ctr ...
- 大数据之-Hadoop3.x_MapReduce_切片源码分析---大数据之hadoop3.x工作笔记0104
然后我们开始来看看,切片的源码,看看到底是怎么切片的 然后我们继续调试,我们快速走就可以了,上节,已经调试一遍了. 然后进入job提交方法
- SpringBoot实现过滤器、拦截器与切片源码分析
过滤器Filter 过滤器概念 Filter是J2E中来的,可以看做是Servlet的一种"加强版",它主要用于对用户请求进行预处理和后处理,拥有一个典型的处理链.Filter也可 ...
- Spring AOP面向切面源码解析
IoC 和 AOP 被称为 Spring 两大基础模块 AOP(Aspect-Oriented Programming) 在程序设计领域拥有其不可替代的适用场景和地位.Spring AOP 作为 AO ...
- Hadoop源码解析
一.hadoop的Job 提交流程源码 流程图: 1.从我们编写的mapreduce的代码中进入job提交源码 支线一:进入connect(); 2.支线二:进入submitter.submitJob ...
- 2015.07.20MapReducer源码解析(笔记)
MapReducer源码解析(笔记) 第一步,读取数据源,将每一行内容解析成一个个键值对,每个键值对供map函数定义一次,数据源由FileInputFormat:指定的,程序就能从地址读取记录,读取的 ...
- MapReduce的分片机制源码解析
目录 一.分⽚的概念 二.分片大小的选择 三.源码解析 1)FileSplit源码解析 2)FileInputFormat源码解析 3)TextInputFormat源码解析 4) LineRecor ...
最新文章
- poj 1904 King's Quest
- Unreal Engine 4 RenderTarget制作Live Camera效果
- 谷歌研究发现优秀的团队必须具备这五个关键特质
- UML总结---UML九种图关系说明
- html的document操作
- Java并发编程之线程安全性
- matlab 获取axes图片,matlabaxes显示图片
- 2000G视频资料送带资源账号
- SVM支持向量机原理详解
- 海康威视摄像头连接(.net)
- 接口测试平台-18:首页完善和项目模块初窥
- 如何更改linux文件的拥有者及用户组 chown和chgrp
- Css Reset -Css样式重置
- Cesium - 地图下载器(python)
- 单片机应用编程技巧---MCU专家答网友问
- django传值给模板, 再用JS接收并进行操作
- 【BZOJ】3007 拯救小云公主 最短路径
- 语文(文学)类智力竞赛题荟萃
- 用Java实现计算器基础运算
- “云网融合”关键在产业携手共进
热门文章
- 学习笔记四:HMM(隐马尔科夫模型)
- win2003文件服务器问题,win7访问win2003文件服务器的相关问题汇总
- mybatis中关于example类详解mybatis的Example[Criteria]的使用
- 湖北工业大学图书馆无线网连接
- nodemon无法启动的解决方案
- Webpack 常用 loader 和 plugin 汇总
- 搞不好击溃了那边v会快乐吗,编号即可里面,搞不好击溃了那边v会快乐吗,编号即可里面,搞不好击溃了那边v会快乐吗,编号即可里面,
- parseInt方法
- 微信bug二维码崩溃漏洞?poc来了! 生成你们自己的二维码
- 使用JMH编写基准测试