FileInputFormat的实现类

news2025/1/21 6:31:12

FileINputFormat的切片机制

FileInputFormat是MapReduce中用于处理文件输入的基类,它定义了输入文件的切片规则,并提供了默认的切片实现。具体来说,FileInputFormat会根据输入文件的大小和块大小等因素计算出每个切片的起始位置和长度,然后将这些切片封装成InputSplit对象,并将它们作为Mapper的输入。

继承了FileInputFormat的类都使用了FileInputFormat的切片机制。

切片机制

  1. 简单按照文件的内容长度进行切片
  2. 集群模式下,切片大小默认=HDFS块大小
  3. 切片时不是非要把一个切片占满,而是根据文件进行单独切片(不管文件多小都会单独占用一个切片)

案例

输入目录下有3个文件:

a.txt    200MB
b.txt    120MB
c.txt    10MB

我们hadoop3.x默认的HDFS块大小=128MB,则切片如下:
 

a.txt.split1--    0~128
a.txt.split2--    128~200
b.txt.split1--    0~120
c.txt.split1--    0~10

 

TextInputFormat

        TextInputFormat是MapReduce默认的实现类,也就是数据的默认的输入到map函数的格式。TextInputFormat是安航读取文件的内容。其中,键是存储每一行的字节偏移量,是LongWritable类型。值是这一行的文本内容(不包括换行符和回车符)。

案例

输入文件a.txt:

hello world
hello hadoop,java
I like java a lot

 该文本文件对应的键值对如下:

key  value
-------------
0    hello world
12   hello hadoop,java
30   I like java a lot

其中,0、12、13是每一行文本的键,而每一行的内容就是该键所对应的值。 

实例:之前的worldcount、流量统计。

KeyValueTextInputFormat

 

        每一行均为一条记录,被分隔符分隔为kry,value。默认的分隔符为 "\t" ,也就是Tab键。可以通过驱动类来设置默认的分隔符,如下:

conf.set(KeyValueLineRecordReader.KRY_VALUE_SEPERATOR,"\t");

分隔符之前的为key,分隔符之后的内容为value,它们都是Text类型。

案例

输入文件:a.txt

hello    world
hello    java
hello    Hadoop,Java

  该文本文件对应的键值对如下:

 key   value
-------------
hello  world
hello  java
hello  Hadoop,Java

其中,每一行的key均为hello,其余内容为值。 

NLineInputFormat

        如果使用NLineInputFormat,代表每个map进程处理的InputSplit不再按Block块去划分,而是按照NLineInputFormat指定的行数N去划分。也就是说,文件的总行数/N=切片数,如果不能整除,则切片数=商+1。

案例

输入文件:a.txt

hello hadoop
hello world
hello java
hello spark
hello storm

比如N=2,则对应的分片为两个,同时将开启两个MapTask:

分片1:

 key   value
-------------
0      hello hadoop
13     hello world
25     hello java

分片2:

 key   value
-------------
35     hello java
46     hello storm

这里的键和TextInputFormat一致。

ConbineTextInputFormat

MapReduce默认的TextInputFormat的切片机制是按文件进行规划切片,集群模式下,默认的切片大小=HDFS块大小但一般不管文件多小,都会给它分配一个MapTask去执行,这样如果有大量的小文件,就需要开启大量的MapTask,极大地耗费资源。

比如我们的输入目录下有多个文件:

a.txt 1MB
b.txt 1.2MB
c.txt 0.5MB
d.txt 4MB

显然不值得为每一个文件去开启一个MapTask,所以我们使用ConbineTextInputFormat来解决,他可以将多个小文件从逻辑上划分到一个切片当中(逻辑的意思就是并不是把这些小文件合并成一个文件),这样,多个文件就可以交给一个MapTask去执行。

虚拟存储值

ConbineTextINputFormat的切片机制:

虚拟存储过程:

        将输入目录下的文件依次与设置的最大分片值进行比较。

  1. 如果文件大小<=分片最大值,则单独划分为一个虚拟存储块。
  2. 如果文件大小>分片最大值并且<2*分片最大值,则将文件一分为二,形成两个虚拟存储块。
  3. 如果文件大小>分片最大值并且>2*分片最大值时,以最大值切割一块。

切片过程:

  1. 判断虚拟存储文件的大小是否 >= 分片最大值,大于等于则单独形成一个切片。
  2. 如果不大于则和下一个虚拟存储我呢间共同进行合并,共同形成一个切片。

案例

输入4个文件:

a.txt    1.7MB
b.txt    2.0MB
c.txt    6.8MB
d.txt    5.2MB

虚拟存储过程:

a.txt(1.7MB) < 4MB    划分一块
b.txt(2.0MB) < 4MB    划分一块
c.txt(6.8MB) > 4MB    划分为两块各自3.4MB
d.txt(5.2MB) > 4MB    划分为两块各自2.6MB

最终的虚拟存储文件:
1.7MB
2.0MB
3.4MB
3.4MB
2.6MB
2.6MB

 切片过程:首先根据文件名的字典序对文件进行排序,再对虚拟存储文件进行合并

切片1:1.7MB+2.0MB
切片2:3.4MB+3.4MB
切片3:2.6MB+2.6MB

最终切片数从4->3,仍然需要开启3个MapTask,依旧占用资源。这是因为我们 设置的切片最大值过小,如果我们设置切片最大值=20MB,则:

a.txt(1.7MB) < 20MB    划分一块
b.txt(2.0MB) < 20MB    划分一块
c.txt(6.8MB) < 20MB    划分一块
d.txt(5.2MB) < 20MB    划分一块

最终的虚拟存储文件
1.7MB
2.0MB
6.8MB
5.2MB

切片:
切片1:(1.7+2.0+6.8+5.2)

 切片数:4->1,只需要开启1个MapTask。

设置数据输入格式

不需要修改代码,只需要在Driver类中修改Job的属性:

默认的输入格式为TextInputFormat,如果是多个小文件的情况,我们需要设置输入格式:

//设置切片规则-默认为TextInputFormat.class
        job.setInputFormatClass(CombineTextInputFormat.class);

设置虚拟存储的最大值

//设置虚拟存储切片为4MB-根据实际需求灵活调整大小
//        CombineTextInputFormat.setMaxInputSplitSize(job,4194304);
        //设置虚拟存储切片为20MB
        CombineTextInputFormat.setMaxInputSplitSize(job,20971520);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/527446.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【机器学习】多元线性回归详解和特征压缩

注意⚠️阅读本文前&#xff0c;你应该需要掌握&#xff1a;机器学习线性回归模型、高等数学微积分部分内容、线性代数矩阵部分内容 前情提要&#xff1a;https://blog.csdn.net/weixin_45434953/article/details/130593910 一、多元线性回归的假设函数 首先我们考虑以下的例…

linux Ubuntu Python 3.10 环境报错与解决方案集合

环境配置参考文章&#xff1a;使用Alpaca-Lora基于LLaMA(7B)二十分钟完成微调 1.报错.nvidia/cublas/lib/libcublas.so.11: undefined symbol: cublasLtHSHMatmulAlgoInit, version libcublasLt.so.11 解决方法&#xff1a; pip uninstall nvidia_cublas_cu112.CUDA版本对应…

Guitar Pro8优秀的自动扒谱软件

对于一些技术娴熟的音乐人来说&#xff0c;不仅需要演奏已有的乐谱&#xff0c;有时还需要从听到的其他音乐中将谱子扒下来。扒谱时可以借助扒谱软件&#xff0c;比如Guitar Pro&#xff0c;就是一款优秀的扒谱软件。下面就和大家分享一下guitar pro能自动扒谱吗&#xff0c;gu…

基于Java+SpringBoot+Vue餐厅点餐管理系统设计和实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

spring boot与asp.net core区别联系

之前一直使用C#编写网站&#xff0c;最近也在了解学习java&#xff0c;根据目前我了解的和学习到的做一个总结分析&#xff0c;写的不好&#xff0c;大家见谅。 联系 名称javac#DIspringasp.net core、Autofac、UnityAOPspringasp.net coreORMmubatis、HibernateEntityFramew…

【MySQL】MySQL索引之最左前缀优化

文章目录 一、联合索引联合索引执行示例 二、索引的 order by优化MySQL中的排序方式数据准备无索引有索引where子句索引字段顺序不一致order by索引字段顺序不一致索引字段升降序不一致 三、总结 一、联合索引 对主键建立的索引叫做聚簇索引, 对普通字段建立的索引叫做二级索引…

Linux实操篇---常用的基本命令1(跟文件操作相关的命令)

一、常用的基本命令 1.常用的shell命令 Shell可以看作是一个命令解释器&#xff0c;为我们提供了交互式的文本控制台界面。 目前的发行版本&#xff1a;在bin/sh 最早的版本Unix&#xff1a;Bourne shell—>Bourne Again Shell 取了 B A Sh。因此目前Linux的发行版大多数…

PieCloudDB Database 与多家基础架构软件厂商完成产品兼容性认证

数据库作为数字经济建设的重要基础&#xff0c;扮演着产业数字化和数据价值释放的基石角色。然而&#xff0c;数据库的发展不能仅仅依赖于自身的技术和创新&#xff0c;也需要建立一个良好的生态系统&#xff0c;与各方合作共同推进数据库技术的进步与创新。 拓数派&#xff08…

港联证券|受两大消息刺激,美最大太阳能公司股价创十年最大日涨幅

因两大利好消息&#xff0c;美国第一太阳能公司&#xff08;FirstSolar&#xff0c;下称第一太阳能&#xff09;股价大涨。 5月12日&#xff0c;第一太阳能宣布&#xff0c;拟最高支付8000万美元收购瑞典钙钛矿企业Evolar AB。其中包括交易完成时支付3800万美元&#xff0c;以及…

SpringSecurity-从入门到精通学习笔记

SpringSecurity从入门到精通 课程介绍 0. 简介 ​ Spring Security 是 Spring 家族中的一个安全管理框架。相比与另外一个安全框架Shiro&#xff0c;它提供了更丰富的功能&#xff0c;社区资源也比Shiro丰富。 ​ 一般来说中大型的项目都是使用SpringSecurity 来做安全框架。…

基于qt5的应用程序在windows和linux环境下修改图标及制定后缀关联

基于qt5的应用程序在windows和linux环境下修改图标及制定后缀关联 1、windows 1.1 修改应用程序图标 方式一&#xff1a; 使用qmake来生成makefile文件&#xff0c;只需要在.pro中添加&#xff1a; RC_ICONS logo.ico 然后&#xff0c;重新生成makefile文件和应用程序&…

MySQL学习---15、流程控制、游标

1、流程控制 解决复杂问题不可能是通过一个SQL语句完成&#xff0c;我们需要执行多个SQL操作。流程控制语句的作用就是控制存储过程中SQL语句的执行顺序&#xff0c;是我们完成复杂操作必不可少的一部分。只要是执行的程序&#xff0c;流程就分为三大类&#xff1a; 1、顺序结…

MMM(Master-Master replication manager for MySQL)

MMM&#xff08;Master-Master replication manager for MySQL&#xff0c;MySQL主主复制管理器&#xff09; 是一套支持双主故障切换和双主日常管理的脚本程序。MMM 使用 Perl 语言开发&#xff0c;主要用来监控和管理 MySQL Master-Master &#xff08;双主&#xff09;复制&…

【计算机视觉】CLIP:连接文本和图像(关于CLIP的一些补充说明)

文章目录 一、前言二、背景及相关工作三、方法3.1 Costly datasets3.2 Narrow3.3 Poor real-world performance 四、要点4.1 CLIP is highly efficient4.2 CLIP is flexible and general 五、限制六、更广泛的影响七、结论 一、前言 我们推出了一个名为CLIP的神经网络&#xf…

原神服务端搭建架设教程win系统(附客户端+服务端+环境配置)

原神服务端搭建架设教程win系统(附客户端服务端环境配置) 大家好&#xff0c;我是艾西原神一款开放世界冒险3D游戏以七种元素&#xff08;分别为风、雷、岩、火、水、草、冰&#xff09;交汇的幻想世界“提瓦特”创造的游戏世界&#xff0c;以角色扮演的RPG游戏还是有非常多的玩…

Prompt工程师指南[应用篇]:Prompt应用、ChatGPT|Midjouney Prompt Engineering

Prompt工程师指南[应用篇]&#xff1a;Prompt应用、ChatGPT|Midjouney Prompt Engineering 1.ChatGPT Prompt Engineering 主题&#xff1a; 与 ChatGPT 对话 Python 笔记本 Topics: ChatGPT介绍审查对话任务与ChatGPT对话Python笔记本 ChatGPT介绍 ChatGPT是OpenAI训练的…

(数字图像处理MATLAB+Python)第七章图像锐化-第三节:高斯滤波与边缘检测

文章目录 一&#xff1a;高斯函数&#xff08;1&#xff09;定义&#xff08;2&#xff09;特点 二&#xff1a;LOG算子&#xff08;1&#xff09;定义&#xff08;2&#xff09;程序 三&#xff1a;Canny算子&#xff08;1&#xff09;最优边缘检测&#xff08;2&#xff09;C…

前端开发推荐vscode安装什么插件?

前言 可以参考一下下面我推荐的插件&#xff0c;注意&#xff1a;插件的目的是用于提高开发的效率&#xff0c;节约开发的时间&#xff0c;像类似检查一些bug、拼写错误等这些可以使用插件快速的识别&#xff0c;避免在查找错误上浪费过多的时间&#xff0c;但切记不要过度依赖…

高速电路设计阻抗匹配的几种方法

为什么要阻抗匹配? 在高速数字电路系统中&#xff0c;电路数据传输线上阻抗如果不匹配会引起数据信号反射&#xff0c;造成过冲、下冲和振铃等信号畸变&#xff0c;当然信号沿传输线传播过程当中&#xff0c;如果传输线上各处具有一致的信号传播速度&#xff0c;并且单位长度…

AVL和二叉树介绍

AVL tree介绍 AVL的全称是&#xff1a;Adelson-Velsky-Landis&#xff0c;是发明这种高度平衡二叉树的人名的缩写&#xff0c;AVL tree是一种优化了的搜索二叉树。 这是二叉排序树会存在的一个问题&#xff0c;先看案例: 给定一个数列为{1,2,3,4,5,6}&#xff0c;将这个数列…