文章目录

  • 1. InputFormat阶段流程
  • 2. InputFormat与其子类关系图
  • 3. TextInputFormat(默认)
  • 3.1 切片机制
  • 3.2 读取机制
  • 3.3 如何设置?
  • 4. CombineFileInputFormat
  • 4.1 切片机制
  • 4.2 读取机制
  • 4.3 如何设置?


1. InputFormat阶段流程

InputFormat阶段是MapReduce的一个阶段。


2. InputFormat与其子类关系图

mapreduce的输出结果 mapreduce inputformat_mapreduce

接下来主要介绍以下两个类的切片机制和读取机制:TextInputFormat类 和 CombineFileInputFormat

3. TextInputFormat(默认)

假如集群中有n台主机,有一个 jobmap 阶段需要 kMapTask进行处理,那么会调用 k 台主机进行处理。

所以,MapTask 的并行度决定 Map 阶段的任务处理并发度,进而影响到整个 Job 的处理速度

那么问题来了?怎么判断一个job应该分成几个MapTask???

先理解两个概念:

  1. 数据块:Block 是 HDFS 物理上把数据分成一块一块,它是 HDFS 存储数据的单元。
  2. 数据切片:数据切片只是在逻辑上对输入进行分片,并不会在磁盘上将其切分成片进行存储。一个切片会对应启动一个 MapTask

3.1 切片机制

  1. 默认逐个对job提交的每个数据文件按照splitSize大小切片默认splitSize的值就是块大小,其计算公式为:
  2. mapreduce的输出结果 mapreduce inputformat_大数据_02

  3. 比如:
  4. mapreduce的输出结果 mapreduce inputformat_数据_03

注意:如果文件小于块大小,那么会表现为按文件切片。

  1. 每次切片时,都要判断切完剩下的部分是否大于块的1.1倍,不大于1.1倍就划分一块切片。【主要用于判断最后剩余的部分切还是不切】

3.2 读取机制

对于每个MapTask一行一行的读取。

  1. key:离文件开始处的偏移量。
  2. value:为该行的内容。

3.3 如何设置?

默认使用TextInputFormat切片机制,故不需要设置。

  1. job如何输入多个文件:
  1. 如何查看切了几片:

4. CombineFileInputFormat

CombineFileInputFormat用于小文件多的场景。

4.1 切片机制

  1. 先将文件按字典顺序由小到大排序
  2. 对每个文件按maxInputSplitSize(默认等于4)进行分割成更多更小的文件
  3. 然后将小文件结合起来做为一个片

4.2 读取机制

和TextInputFormat一样。

4.3 如何设置?

如何使用CombineTextInputFormat进行切片?如何设置maxInputSplitSize大小?

mapreduce的输出结果 mapreduce inputformat_mapreduce_04