org.apache.hadoop.mapreduce.InputFormat 是一个抽象类,
关于这个抽象类的功能描述如下:
1、首先为Job验证输入;
2、将输入的文件分成逻辑上的splits,每个split会被应用到一个单独的mapper上;
3、提供RecorderReader的实现,用来从逻辑split中一点一点的收集数据到mapper中。
这个抽象类中,有两个抽象方法需要实现:
1. public abstract List<InputSplit> getSplits(JobContext context) throws IOException, InterruptedException;
从方法名和它的返回类型就可以猜到,这个接口主要责任就是将一大堆的输入文件分成一系列的splits(每个split是用一个InputSplit对象来表示)。然后每个InputSplit被传递给不同的mapper进行处理。但是要注意,分片仅仅是逻辑上的分片,并不是真地将文件分成多块了。一个分片可以用(输入文件路径,开始位置,偏移量)元组来表示。
2. public abstract RecordReader<K,V> createRecordReader(InputSplit split, TaskAttemptContext context ) throws IOException, InterruptedException;
这个接口的责任是返回一个读取器,来读取这种InputFormat的分片文件,至于怎么读取,就是一种读取策略了,Hadoop框架自身实现了一些,我们当然也可以实现自己的策略满足自己的需求。
在Hadoop中最常用的就是文件作为 job 的输入,这个是由抽象类 FileInputFormat 和 其子类来实现的,它将输入的文件按照大小进行分片。文件系统的块大小被看作是分片的一个上界。下界可以通过设定mapred.min.split.size来指定。基于文件大小的这种逻辑分片方法有的时候是低效的,因为这个时候我们必须去关注边界上的记录是否完整并做出特殊处理,只有这样处理之后,确保没有中间截断的记录,这样才能够传递给mapper来进行进一步的处理。
其中的FileInputFormat继承自InputFormat,但是只是实现了getSplits方法,另一个获取读取器的方法没有实现,这样做是有道理的,因为很多不同格式的文件需要使用不同的读取器来提取数据,比如lzo压缩后的文件的读取器,要先解压后才能读取。
源代码中形成splits列表的逻辑大概是这样的:
首先会从 job 对象中所有的输入文件的列表提取出来
List<FileStatus>files = listStatus(job);
然后就要对每个文件进行逻辑分片了,
分片的逻辑大概是这样的:
首先计算这个文件的长度(按照字节),然后将这个文件的块信息拿出来。如果这个文件可以被分片并且长度不是0,那么就开始进行逻辑分片。每个分片的大小通过函数computeSplitSize来计算。然后如果文件的剩余长度是分块的1.1倍以上的话,就创建一个新分片:
splits.add(new FileSplit(path, length-bytesRemaining, splitSize, blkLocations[blkIndex].getHosts()));
进而,将剩余长度减去已经被分配掉的splitSize,这样循环直到不满足条件。等循环完成之后,如果还有剩余的部分,那么剩下就可以再做一个分片,加入到列表中。
但是,如果我们一开始输入的文件的大小是不可分割的话,那么我们就把整个文件作为一个分片,形成一个实例:
splits.add(new FileSplit(path, 0, length, blkLocations[0].getHosts()));
如果这个文件是可分割的,但是长度是0,也做一个默认的分片:
splits.add(new FileSplit(path, 0, length, new String[0]));
这样,文件的分片列表就产生了,然后读取器就可以从这些分片中按照相应的读取逻辑来读取数据,并交给mapper进行处理了。
分享到:
相关推荐
qtz40塔式起重机总体及塔身有限元分析法设计().zip
Elasticsearch是一个基于Lucene的搜索服务器
资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。
美国纽约HVAC(暖通空调)数据示例,谷歌地图数据包括:时间戳、名称、类别、地址、描述、开放网站、电话号码、开放时间、更新开放时间、评论计数、评级、主图像、评论、url、纬度、经度、地点id、国家等。 在地理位置服务(LBS)中,谷歌地图数据采集尤其受到关注,因为它提供了关于各种商业实体的详尽信息,这对于消费者和企业都有极大的价值。本篇文章将详细介绍美国纽约地区的HVAC(暖通空调)系统相关数据示例,此示例数据是通过谷歌地图抓取得到的,展示了此技术在商业和消费者领域的应用潜力。 无需外网,无需任何软件抓取谷歌地图数据:wmhuoke.com
2023-04-06-项目笔记-第四百五十五阶段-课前小分享_小分享1.坚持提交gitee 小分享2.作业中提交代码 小分享3.写代码注意代码风格 4.3.1变量的使用 4.4变量的作用域与生命周期 4.4.1局部变量的作用域 4.4.2全局变量的作用域 4.4.2.1全局变量的作用域_1 4.4.2.453局变量的作用域_453- 2025-04-01
1_实验三 扰码、卷积编码及交织.ppt
北京交通大学901软件工程导论必备知识点.pdf
内容概要:本文档总结了 MyBatis 的常见面试题,涵盖了 MyBatis 的基本概念、优缺点、适用场合、SQL 语句编写技巧、分页机制、主键生成、参数传递方式、动态 SQL、缓存机制、关联查询及接口绑定等内容。通过对这些问题的解答,帮助开发者深入理解 MyBatis 的工作原理及其在实际项目中的应用。文档不仅介绍了 MyBatis 的核心功能,还详细解释了其在不同场景下的具体实现方法,如通过 XML 或注解配置 SQL 语句、处理复杂查询、优化性能等。 适合人群:具备一定 Java 开发经验,尤其是对 MyBatis 有初步了解的研发人员,以及希望深入了解 MyBatis 框架原理和最佳实践的开发人员。 使用场景及目标:①理解 MyBatis 的核心概念和工作原理,如 SQL 映射、参数传递、结果映射等;②掌握 MyBatis 在实际项目中的应用技巧,包括 SQL 编写、分页、主键生成、关联查询等;③学习如何通过 XML 和注解配置 SQL 语句,优化 MyBatis 性能,解决实际开发中的问题。 其他说明:文档内容详尽,涵盖面广,适合用于面试准备和技术学习。建议读者在学习过程中结合实际项目进行练习,以更好地掌握 MyBatis 的使用方法和技巧。此外,文档还提供了丰富的示例代码和配置细节,帮助读者加深理解和应用。
《基于YOLOv8的智能电网设备锈蚀评估系统》(包含源码、可视化界面、完整数据集、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计
插头模具 CAD图纸.zip
资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。
《基于YOLOv8的智慧农业水肥一体化控制系统》(包含源码、可视化界面、完整数据集、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计
python爬虫;智能切换策略,反爬检测机制
台区终端电科院送检文档
e235d-main.zip
丁祖昱:疫情对中国房地产市场影响分析及未来展望
MCP快速入门实战,详细的实战教程
YD5141SYZ后压缩式垃圾车的上装箱体设计.zip
IMG_20250401_195352.jpg
DeepSeek系列专题 DeepSeek技术溯源及前沿探索.pdf