文章目录

  • 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、源码步骤

  1. 程序先找到数据存储的目录;

  2. 开始遍历处理目录下的每个文件;

    • 获取文件大小:fs.sizeOf(ss.txt);

    • 计算切片大小:computeSplitSize(minSize,Math.min(maxSize,blockSize))

      blockSize=128M

    • 每次切片时,都要判断切完剩下的部分是否大于块的1.1倍,不大于1.1倍就划分为一个切片

    • 将切片信息写到一个切片规划文件中

    • 整个切片的核心过程在getSplit()方法中完成

    • InputSplit只记录切片的元数据信息,如起始位置、长度以及节点列表等。

  3. 提交切片规划文件到Yarn上,Yarn上的MrAppMaster就可以根据切片规划文件计算MapTask个数。

3、FileInputFormat切片机制

  1. 按照文件内容长度进行切片
  2. 默认切片大小等于Block大小
  3. 切片时不考虑数据集整体,而是逐个针对每个文件单独切片

案例:

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的基础上准备四个小文件进行测试

  1. 未改动前:切片为4;

  2. Driver中添加代码:

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

切片为3;

  1. Driver中添加代码:
// 如果不设置InputFormat,它默认用的是TextInputFormat.class
job.setInputFormatClass(CombineTextInputFormat.class);//虚拟存储切片最大值设置20m
CombineTextInputFormat.setMaxInputSplitSize(job, 20971520);

切片为1;

FileInputFormat切片源码解析相关推荐

  1. 十六、FileInputFormat介绍,切片源码分析

    一.InputFormat介绍 InputFormat,从单词意思解读分为输入.格式,也就是数据来源与加载数据的方式是决定MR编程的map阶段的任务并行度. 数据来源划分:其实也就是他的子类,由于我目 ...

  2. Hadoop MapReduce Splits 切片源码分析及切片机制

    本文从Job提交,逐步分析Splits相关源码. 数据块:Block是HDFS物理上把数据分成一块一块的. 数据切片:数据切片只是在物理上输入进行分片,并不会在磁盘上将其分成片进行存储. 文件路径 o ...

  3. 大数据之-Hadoop3.x_MapReduce_切片源码总结---大数据之hadoop3.x工作笔记0105

    可以看到我们分析完,切片的源码,然后总结一下hadoop3.x的MapReduce的切片 过程 首先要知道切片这个过程是在InputFormat这个类中进行的 我们在InputFormat上按下ctr ...

  4. 大数据之-Hadoop3.x_MapReduce_切片源码分析---大数据之hadoop3.x工作笔记0104

    然后我们开始来看看,切片的源码,看看到底是怎么切片的 然后我们继续调试,我们快速走就可以了,上节,已经调试一遍了. 然后进入job提交方法

  5. SpringBoot实现过滤器、拦截器与切片源码分析

    过滤器Filter 过滤器概念 Filter是J2E中来的,可以看做是Servlet的一种"加强版",它主要用于对用户请求进行预处理和后处理,拥有一个典型的处理链.Filter也可 ...

  6. Spring AOP面向切面源码解析

    IoC 和 AOP 被称为 Spring 两大基础模块 AOP(Aspect-Oriented Programming) 在程序设计领域拥有其不可替代的适用场景和地位.Spring AOP 作为 AO ...

  7. Hadoop源码解析

    一.hadoop的Job 提交流程源码 流程图: 1.从我们编写的mapreduce的代码中进入job提交源码 支线一:进入connect(); 2.支线二:进入submitter.submitJob ...

  8. 2015.07.20MapReducer源码解析(笔记)

    MapReducer源码解析(笔记) 第一步,读取数据源,将每一行内容解析成一个个键值对,每个键值对供map函数定义一次,数据源由FileInputFormat:指定的,程序就能从地址读取记录,读取的 ...

  9. MapReduce的分片机制源码解析

    目录 一.分⽚的概念 二.分片大小的选择 三.源码解析 1)FileSplit源码解析 2)FileInputFormat源码解析 3)TextInputFormat源码解析 4) LineRecor ...

最新文章

  1. poj 1904 King's Quest
  2. Unreal Engine 4 RenderTarget制作Live Camera效果
  3. 谷歌研究发现优秀的团队必须具备这五个关键特质
  4. UML总结---UML九种图关系说明
  5. html的document操作
  6. Java并发编程之线程安全性
  7. matlab 获取axes图片,matlabaxes显示图片
  8. 2000G视频资料送带资源账号
  9. SVM支持向量机原理详解
  10. 海康威视摄像头连接(.net)
  11. 接口测试平台-18:首页完善和项目模块初窥
  12. 如何更改linux文件的拥有者及用户组 chown和chgrp
  13. Css Reset -Css样式重置
  14. Cesium - 地图下载器(python)
  15. 单片机应用编程技巧---MCU专家答网友问
  16. django传值给模板, 再用JS接收并进行操作
  17. 【BZOJ】3007 拯救小云公主 最短路径
  18. 语文(文学)类智力竞赛题荟萃
  19. 用Java实现计算器基础运算
  20. “云网融合”关键在产业携手共进

热门文章

  1. 学习笔记四:HMM(隐马尔科夫模型)
  2. win2003文件服务器问题,win7访问win2003文件服务器的相关问题汇总
  3. mybatis中关于example类详解mybatis的Example[Criteria]的使用
  4. 湖北工业大学图书馆无线网连接
  5. nodemon无法启动的解决方案
  6. Webpack 常用 loader 和 plugin 汇总
  7. 搞不好击溃了那边v会快乐吗,编号即可里面,搞不好击溃了那边v会快乐吗,编号即可里面,搞不好击溃了那边v会快乐吗,编号即可里面,
  8. parseInt方法
  9. 微信bug二维码崩溃漏洞?poc来了! 生成你们自己的二维码
  10. 使用JMH编写基准测试