Hadoop3教程(十):MapReduce中的InputFormat

文章目录

  • (87)切片机制与MapTask并行度决定机制
  • (90) 切片源码总结
  • (91)FileInputFormat切片机制
  • (92)TextInputFormat及其他实现类一览
  • (93) CombineTextInputFormat切片机制
    • 原理
    • 案例讲解
  • 参考文献

(87)切片机制与MapTask并行度决定机制

什么是MapTask的并行度?

即在一个MR程序里,需要并行开启多少个MapTask,来处理数据。

并行度是越大越好么,当然不是,这玩意儿当然还得看需要处理的数据量,如果数据量不大,开一堆MapTask的话,既浪费资源,又拖慢整体速度(MapTask初始化也是要时间的)。

那么MapTask的并行度设置多少比较合适,或者说应该参考什么指标来制定?

首先我们复习一下block的概念,即文件块,是HDFS存储数据的单位,一般是128M一个数据块。block属于是在物理磁盘上,切切实实的对数据进行了分割。

再介绍一个新概念,即数据切片,数据切片是在逻辑上对输入的数据进行分片,并不会影响数据在物理上的存储。数据切片是MapReduce中计算输入数据的单位,每一个数据切片会对应启动一个MapTask。

直接总结给出结论:

  • 一个job(或者说一个MR程序)的Map阶段并行度,由客户端在提交job时的切片数来决定;

  • 每一个切片分配一个MapTask

  • 默认情况下,切片大小等于块大小。(即默认也是128M)

  • 切片时不考虑数据整体,而是逐个对每一个所提交文件单独切片,即不可能出现文件A的末尾和文件B的开头出现在同一片里,这种情况。

结论3和结论4其实原因差不多哈,可以理解成是为了尽量避免在不同DataNode之间通信的损耗。

比如说现在我要处理的一个大文件,命名成a.txt吧,它的第一个block位于DataNode_1上,第二个block位于DataNode_2上,第三个block位于DataNode_3上。

如果切片大小不等于block大小的话,且考虑数据整体,那肯定会出现不同DataNode上的数据位于同一个切片的情况。

比如说我把切片大小定为100M,那么第一片就位于DataNode_1上,是0M~100M,然后DataNode_1上只剩下28M数据,需要从DataNode_2上再拿72M数据,才能再凑齐一个切片。

那这就有问题了,在处理第二个切片的时候,需要同时通信DataNode_1和DataNode_2,肯定是不如在单个DataNode上完全处理完要好。

因此,切片大小等于块大小,是比较好的。

结论4的原因也差不多,不同文件的block存放的DataNode那肯定更五花八门了,说不定处理一个切片都得联系五六个DataNode,那太低效了。

(90) 切片源码总结

切片这个动作是针对输入数据的,默认是FileInputFormat,主要步骤我们可以文件简单描述一遍。

1) 程序需要先找到你数据存储的目录;

2) 开始遍历(以规划切片)该目录下的每一个文件;

3) 遍历第一个文件a.txt

3.1) 先获取文件的大小;

3.2) 然后计算(或者说获取)切片的大小。这个是有计算公式的:

computeSplitSize = max(minSize, min(maxSize, blocksize))

minSize默认是1M,maxSize默认是Long型的最大值。

因此默认情况下,上面公式会计算出computeSplitSize = blocksize

这里我们发散一下,如果我想改大切片大小,比如说想让它等于256M,我该怎么办?

当然是修改minSize=256,上式可以自己算一下。

同理,如果是想改小切片大小,比如说等于64M,那就修改maxSize=64

简单的说就是,如果想调小片大小,就修改MaxSize,如果想调大片大小,就修改MinSize

3.3) 然后开始切片,比如说0~128是第一片,128~256是第二片;

这里也有个需要注意的点,就是每次切片的时候,都会判断切完后,该文件剩下的大小,是否大于blocksize(教程里写的是块大小,但是我感觉这里是不是对比的应该是切片大小,之后看源码来判断吧)的1.1倍,如果小于的话,那就不再切了,剩下的部分作为最后一块切片。反之则继续切。

3.4) 将切片的信息写到一个切片规划文件中;

这里的切片规划InputSplit只记录了切片的元数据信息,比如每一片的切片起始位置等,并不是真正的切了。

以上切片的核心过程,都是在FileInputFormat.getSplit()中完成;

4) 最后,Client提交切片规划文件给YARN,YRAN上的MrAPPMaster就会根据规划文件来计算所需的MapTask个数。

附一张教程里的图,可做辅助理解:

在这里插入图片描述

(91)FileInputFormat切片机制

默认的FileInputFormat切片机制流程,跟上一小节介绍的基本一样:

  • 根据文件的内容长度开始切片;
  • 切片大小等于block大小
  • 切片时不考虑整体,而是对每一个文件分别切割;

这是默认情况下的一个切片机制, 并不是一成不变的

举一个例子,假设我要处理20个文件,每个文件大小是1KB,当前blockSize=128M,按照上面的规则,对每一个文件分别切片,那就相当于1个文件一片,一共20片,对应的,我就要启动20个MapTask去执行读。

想象一下,就为了这20KB的数据,我需要耗费大量的时间和空间,去初始化并执行20个MapTask,这是非常不合理的,所以这种时候我们就可以打破默认的限制,将几个文件组合在一起来作为一片。这就是CombineTextInputFormat,这个后面会仔细讲。

教程在这里讲了一个基于FileInputFormat的实例,我也放上来吧。

假设现在有两个输入文件:

  • file_1.txt,320M
  • file_2.txt,10M

开始切片,形成的切片信息如下:

  • file_1.txt.split_1:0~128M;
  • file_1.txt.split_2:128~256M;
  • file_1.txt.split_3:256~320M;
  • file_2.txt.split_1:0~10M;

具体的切片流程,上一小节都讲过了,这里就不展开了,只记录一下,在代码里如何获取切片信息?

// 根据文件类型获取切片信息
FileSplit inputSplit = (FileSplit)context.getInputSplit();
//获取切片的文件名称
String name = inputSplit.getPath().getName();

(92)TextInputFormat及其他实现类一览

严格来讲,FileInputFormat是一个接口类,我们日常开发中常用的,还是它的那些接口实现类,比如说:TextInputFormat、KeyValueTextInputFormat、NLineInputFormat、CombineTextInputFormat和自定义InputFormat等。

其中用的最多的,是TextInputFormat和CombineTextInputFormat,所以教程里重点讲了一下这两种,尤其是后者,我就顺着教程来了。

看了下源码, 切片时还需要先判断文件是否可以切割,一般来讲,压缩文件是不能切割的。但是也不绝对,看你用的哪种压缩算法,有的压缩格式的文件倒是也能切,在后续的(123)压缩概述小节里会详细介绍下这些。

KeyValueTextInputFormat,是需要传入一个分隔符,然后拿着这个分隔符去切割输入的数据,切出来的0号位作为Key,剩下的部分作为value。

NLineInputFormat,是一次性读取多行,而TextInputFormat一次性只读取一行,这个区别很好理解,相当于是加强版,就不赘述了。

相当于对TextInputFormat来讲,一个10行的输入文本,它会对应生成10个KV对,但是对NLineInputFormat来讲,它可能只会生成2个KV对(假设它一次性读取5行),可能效率会高一些。

CombineTextInputFormat,是一次性读取多个文件进行组合,组合在一起进行后续的处理,比如说切片。非常适合小文件多的情况,避免了冗余MapTask。

TextInputFormat,就是一行一行读取文件,形成的输入KV对中,键就是该行在整个文件里的起始字节偏移量(我理解,作用跟行号差不多,但确实不是行号),值就是该行的内容,不包含换行和回车符。

以下是一个示例,比如,一个分片包含了如下4条文本记录。

Rich learning form
Intelligent learning engine
Learning more convenient
From the real demand for more close to the enterprise

每条记录在读取后,会表示为以下键值对:

(0,Rich learning form)
(20,Intelligent learning engine)
(49,Learning more convenient)
(74,From the real demand for more close to the enterprise)

(93) CombineTextInputFormat切片机制

原理

1)CombineTextInputFormat是用来解决小文件过多的问题

上一小节提过,TextInputFormat是按照文件做切片的,一个文件,即使只有1KB,也会切成一片,从而开启一个单独的MapTask。在小文件过多的时候,这种对资源的浪费简直是不可想象的。

于是提出了CombineTextInputFormat,它可以把几个小文件在逻辑上分进同一个切片,这样子启动一个MapTask就可以了。

2) CombineTextInputFormat中,切片大小比较难理解,这个涉及到一个虚拟存储的概念。

CombineTextInputFormat.setMaxInputSplitSize(job, 默认大小);

CombineTextInputFormat生成切片的过程,也跟其他实现类不太一样,它是分为两个步骤:

  • 虚拟存储过程
  • 正式切片过程

案例讲解

接下来上一个实例来讲解,比如说要将文件按照字典数据排序。

假设,现在定义的CombineTextInputFormat的MaxInputSplitSize=4M,然后我们的输入数据是四个文件,分别是:

  • a.txt,1.7M;
  • b.txt,5.1M;
  • c.txt,3.4M;
  • d.txt,6.8M;

1) 首先会将文件,按照字典数据做排序,就是abcd,然后再开始切片, 这个排序直接影响了哪些文件会合在一起

2) 接下来是虚拟存储过程:

  • 对a.txt,由于1.7M < 4M ,即MaxInputSplitSize,因此逻辑上划分为1块;
  • b.txt,由于4M < 5.1M < 2 * 4M,因此逻辑上均分为两块,第一块是2.55M,第二块也是2.55M;
  • c.txt,由于3.4M < 4M,因此逻辑上划分为1块;
  • d.txt,4M < 6.8M < 2 * 4M,因此逻辑上均分为两块,块1=3.4M,块2=3.4M;

然后虚拟存储结束,我们得到了以下虚拟分块:

1.7M
2.55M
2.55M
3.4M
3.4M
3.4M

3) 再接着,我们就可以开始规划切片了,这里切片的基本规则: 判断虚拟存储的文件大小是否大于MaxInputSplitSize,如果大于则单独成片,小于则组合下一个虚拟存储文件,直到大于MaxInputSplitSize,组合成片

按照这个规则,我们可以得到以下三个切片:

片一:1.7M + 2.55M
片二:2.55M + 3.4M
片三:3.4M + 3.4M

弹幕里提了一个问题,假设我有一个10M的文件,那么按照上面的规则,是会划分成几个多大的虚拟存储文件?

确实是好问题,4M < 2 * 4M < 10M,我个人感觉是划分成 4M + 3M + 3M,即划分出第一块后,剩下6M重新开始判断,并最终均分为3M + 3M;

也有人说是划分成4M + 4M + 2M,感觉也有点道理,但还是更支持前面那种,先暂存一下,后来再查。

2023-10-15 12:08:08 后来忘记查了,我刚把这个问题问了下文心一言,它告诉我都行。。。两种方式都行。。。。

2023-10-15 12:11:13 查阅了下相关资料,应该是前者,先划分一块4M的出来,剩下的再跟MaxInputSplitSize去比较。合理。

MR代码在编写的时候,需要在Driver里定义以下代码:

// 如果不设置InputFormat,默认使用的是TextInputFormat.class
job.setInputFormatClass(CombineTextInputFormat.class);// 虚拟存储切片最大值设置4m
CombineTextInputFormat.setMaxInputSplitSize(job, 419304);

如果用以上代码来处理上一小节说的4个文件,从打印的日志里可以看到有3个切片:

number of split:3

就说明是3个切片。

参考文献

  1. 【尚硅谷大数据Hadoop教程,hadoop3.x搭建到集群调优,百万播放】
  2. 他来了他来了,Hadoop序列化和切片机制了解一下?

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

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

相关文章

ChatGPT生产力|实用指令(prompt)

GPT已经成为一个不可或缺的科研生产力了&#xff0c;但是大多数人只知晓采用直接提问、持续追问以及细节展开的方式来查阅相关资料&#xff0c;本文侧重于探讨“限定场景限定角色限定主题”、“可持续追问细节展开”等多种方式来获取更多信息&#xff0c;帮人们解决更多问题。 …

移动端签名组件封装 借用插件 vue-esign

目录 需求实现讲解工具 - 图片旋转、base64 转换为 file 对象组件封装组件全局注册组件使用效果展示 需求 移动端需要实现手机横屏手写签名并上传签名图片功能。 实现讲解 vue-esign 插件文档地址 https://www.npmjs.com/package/vue-esign SignCanvas 组件封装原理&#xff1a…

数学建模——最优连接(基于最小支撑树)

一、概念 1、图的生成树 由图G(V,E)的生成子图G1(V,E1)(E1是E的子集&#xff09;是一棵树&#xff0c;则称该树为图G的生成树&#xff08;支撑树&#xff09;&#xff0c;简称G的树。图G有支撑树的充分必要条件为图G连通。 2、最小生成树问题 连通图G(V,E)&#xff0c;每条边…

C语言实现// 输入一个英文句子,以‘ . ’结束,统计句子中包含的字符个数

完整代码&#xff1a; // 输入一个英文句子&#xff0c;以‘ . ’结束&#xff0c;统计句子中包含的字符个数 #include<stdio.h>int main(){char ch;int length0;printf("请输入一个英文句子\n");while (chgetchar()!.){length;}printf("字符个数是&…

开源CasaOS云软件发现关键漏洞

近日&#xff0c;开源 CasaOS 个人云软件中发现的两个严重的安全漏洞。该漏洞一旦被攻击者成功利用&#xff0c;就可实现任意代码执行并接管易受攻击的系统。 这两个漏洞被追踪为CVE-2023-37265和CVE-2023-37266&#xff0c;CVSS评分均为9.8分。 发现这些漏洞的Sonar安全研究…

【Java实战】创建第一个Springboot项目Hello world

没有旗舰版的Idea授权&#xff0c;所以安装了社区版的idea。不知道从何时开始&#xff0c;社区版IDEA的插件不好用了&#xff0c;所以就换了个方法生成Springboot项目。 一 在线生成 选择好对应的选项后&#xff0c;点击生成就可以下载到一个完整的springboot项目了。 二 使用…

linux安装达梦数据库(命令行安装)

安装达梦数据库 创建安装用户 1,创建安装用户组dinstall [rootdmDMServer1 ~]# groupadd -g 12345 dinstallgroupadd : 创建组 -g : 指定组id&#xff08;GID&#xff09; 12345&#xff1a; 指定的组名称 dinstall &#xff1a; 组名 2,创建安装用户dmdba [rootdmDMSe…

Mycat2 分布式数据库中间件

一.安装部署 Mycat2目前还不支持直接获取Docker镜像&#xff0c;需要自己通过Dockerfile打包镜像&#xff0c;其实这也是为了开发者考虑&#xff0c;比如一些个性化功能&#xff0c;如自定义分片等 Dockerfile FROM docker.io/adoptopenjdk/openjdk8:latestENV AUTO_RUN_DIR…

PhotoShop字体加粗,PhotoShop字体添加边框,PhotoShop设置文字背景为图片

字体加粗 创建文字&#xff1a; 选中文字 &#xff08;用鼠标点一下&#xff09; 然后 转换为智能对象 输入合适的数值即可加粗字体 字体添加外边框 点击字体&#xff0c;点击右下角的fx 咋fx中选择描边 设置文字背景为图片 将文字放到刚刚图片所在的位置即可 。…

vscode工程屏蔽不使用的文件夹或文件的方法

一. 简介 vscode是一款 微软提供的免费的代码编辑软件。 对于 IMX6ULL-ALPHA开发板而言&#xff0c;NXP官方uboot一定会支持不止 IMX6ULL芯片的代码&#xff0c;也不止支持 一种架构&#xff0c;还支持其他芯片或架构的源码文件。 为了方便阅读代码&#xff0c;vscode软件可…

2024年关于湖北省建筑安全员B证报考你需要了解

2024年关于湖北省建筑安全员B证报考你需要了解 建筑安全员B证指的是建设厅三类人员建安B证&#xff0c;很多人对于B证报考不是很了解&#xff0c;对于安全员B报考条件、报考流程、报考时间、报考地区等事项叙后尘告诉你们。 湖北建筑安全员B证报考条件-建安B证 1.你的二级建造师…

SpringCloud对服务内某个client进行单独配置

文章目录 问题解决过程问题解决 问题 我们的微服务项目用的是springCloud&#xff0c;某个微服务接口因为数据处理量大&#xff0c;出现了接口超时的情况&#xff0c;我们需要单独修改这一个feignClient的超时时间。 解决过程 一开始项目只是在application文件里面进行了全局…

计算机缺失pasmutility.dll怎么办,三步解决pasmutility.dll缺失

pasmutility.dll文件是windows系统中重要的dll文件&#xff0c;电脑一旦缺失dll文件就会导致电脑无法正常运行&#xff0c;同时还会唐初电脑缺失pasmutility.dll文件的提示窗口&#xff0c;非常影响电脑运行&#xff0c;那么出现计算机缺失pasmutility.dll该怎么办呢&#xff1…

21.1 stm32使用LTDC驱动LCD--配置说明

本文讲解如何配置LTDC驱动LCD的参数配置&#xff0c;以及CubeMx参数配置说明 本文使用的是淘宝买的一块带电容触摸的液晶显示屏&#xff1a;5寸TFT液晶显示屏高清800*480免驱40P通用RGBIPS全视角彩屏GT911 说实话&#xff0c;价格还是相对挺便宜的&#xff0c;值得入手&#xf…

LoRa和LoRaWAN详细介绍

目录 简介 1.LoRaWAN系统架构 2.LoRa射频技术有什么优缺点 3.LoRa和其他通讯方式对比 4.哪些场合和需求需要用到LoRaWAN 简介 LoRa技术是由Semtech公司开发&#xff0c;基于扩频频移键控&#xff08;CSS&#xff09;调制&#xff0c;这种调制技术可以实现在不同频率上发送…

2.SpringSecurity - 处理器简单说明

文章目录 SpringSecurity 返回json一、登录成功处理器1.1 统一响应类HttpResult1.2 登录成功处理器1.3 配置登录成功处理器1.4 登录 二、登录失败处理器2.1 登录失败处理器2.2 配置登录失败处理器2.3 登录 三、退出成功处理器3.1 退出成功处理器3.2 配置退出成功处理器3.3 退出…

list.set交换数据需要(or不需要)添加其他中间变量,两个例子告诉你

说明&#xff1a;set()方法是来修改指定位置的元素。 两个参数&#xff0c;第一个参数是要修改的元素的索引&#xff0c;第二个参数是要设置的新值。 案例一&#xff1a;当链表中传入的是字符串时&#xff1a; public static void main(String[] args) {List list new Linke…

关于W5500网卡使用过程的部分问题记录

某个项目中用到了W5500这种自带网络协议栈的网卡芯片&#xff0c;由于该项目开发时间很紧&#xff0c;就临时网上买了一些模块拼凑到了一套系统&#xff0c;经过验证果真这种拼积木的方法只能用在学生实验开发中&#xff0c;真不能拿来做工程应用&#xff0c;硬件太不稳定很容易…

openGauss学习笔记-101 openGauss 数据库管理-管理数据库安全-客户端接入之用SSH隧道进行安全的TCP/IP连接

文章目录 openGauss学习笔记-101 openGauss 数据库管理-管理数据库安全-客户端接入之用SSH隧道进行安全的TCP/IP连接101.1 背景信息101.2 前提条件101.3 操作步骤 openGauss学习笔记-101 openGauss 数据库管理-管理数据库安全-客户端接入之用SSH隧道进行安全的TCP/IP连接 101.…

杨辉三角按列求和

假设求杨辉三角这一列 我们考虑这个格子&#xff1a; 然后对其不断展开 综上&#xff1a; ∑ i 0 n ( i k ) ( n 1 k 1 ) \sum_{i0}^n\binom i k\binom {n1}{k1} i0∑n​(ki​)(k1n1​) ∑ i l r ( i k ) ( r 1 k 1 ) − ( l k 1 ) \sum_{il}^r\binom i k\binom{r1}{k…