MapReduce FileInputFormat 及常用实现类 对比

1、简介

  • FileInputFormat在MapReduce中主要负责将文件拆分为多个切片InputSplit,并根据不同的记录读取器RecordReaders去读取切片数据,转换为为标准的<key,value>键值对,作为map 的输入

  • 而FileInputFormat有多种不同的实现子类,而每种实现类它的切片机制和记录读取机制都是不同的.

  • 各种实现类如下

  • 在这里插入图片描述

Tip:

  • 数据切片只是在逻辑上对输入进行分片,并不会在磁盘上将其切分成片进行存储

2、FileInputFormat的默认切片机制

  • 按照文件块的大小进行切片
  • 默认块Block的大小是按 128M 去切,因为HDFS默认存储的块大小刚好也是128M. 这样每个MapTask去处理切片内容的时候不必要跨节点加载数据,就能一定的减少传输网络IO
  • 切片时不考虑数据集整体,而是逐个针对每一一个文件单独切片

比如
1、MapReduce输入路径下假如有两个文件,分别是a.txt为320M, b.txt为10M大小
2、则经过FileInputFormat切片后产生的切片信息如下:

// 总产生4个切片,文件a有3个切片,文件b有1个切片
a.txt的切片1: 0~128M
a.txt的切片2: 128~256M
a.txt的切片3: 256~320M

b.txt的切片1:  0~10M

3、TextInputFormat

  • 切片机制与FileInputFormat一致

  • TextInput Format是默认的 FilelnputFormat实现类。

  • 记录读取器RecordReader是按行读取每条记录。

  • 读取后, 键Key是存储该行在整个文件中的起始字节偏移量, Long writable类型。值Value是这行的内容,不包括任何行终止符(换行符和回车符),Text类型。这个键值对 之后会作为Mapper的输入

案例:
下面是一个切片包含的内容信息

1 ---b c
2 ---e f
3 ---a b

则经过 TextInputFormat 读取后输出的<key,value>为:

(0,"---b c")
(6,"---e f")
(12,"---a b")

4、KeyValueTextInputFormat

  • 切片机制与FileInputFormat一致
  • 记录读取器RecordReader是也是按行读取, 但是读取后会将每一行切割两部分,前部分作为key和后半部作为value进行输出
  • 默认的切割分割符为tab(\t),可以通过在Configurition的set方法设置,比如这里这设置成按"—切割" conf.set(KeyValueLineRecordReader.KEY_VALUE_SEPERATOR,"—");

案例:
下面是一个切片包含的内容信息

1 --- b c
2 --- e f
3 --- a b

则经过 KeyValueTextInputFormat 读取后输出的<key,value>为:

(1,"b c")
(2,"e f")
(3,"a b")

5、NLineInputFormat

  • 切片机制与FileInputFormat不同,它是按设置的行数来切片
  • 而记录读取器RecordReader机制与TextInputFormat的一致

案例:
下面是一个切片包含的内容信息

1 --- b c
2 --- e f
3 --- a b
4 --- g d
5 --- f d

如果将切割行数设置为2, 则每2行划分一个切片,则产生3个切片,然后每个切片经过RecordReader读取后输出的<key,value>与TextInputFormat一致
切片1:

(0,"---b c")
(6,"---e f")

切片2:

(12,"---a b")
(18,"---g d")

切片3:

(24,"---f d")

6、CombineTextInputFormat

  • 切片机制与FileInputFormat不同
  • 因为FileInputFormat是对每个文件进行独立切片,不管文件多小每个文件都会单独产生1个或者多个切片. 而CombineTextInputFormat可以将多个小文件从逻辑上规划到一个切片中,这样就可以只交给一个MapTask处理。
  • 应用: CombineTextInputFormat适合对多个小文件的处理

6.1 切片机制

  • 需要根据设置的一个参数,叫虚拟存储切片最大值去进行切片.
  • 会先经过虚拟存储划分产生虚拟存储文件,然后在根据虚拟存储文件的结果信息进行切片.

案例:
假设虚拟存储切片最大值设置为4M
有以下5个文件及其大小
a.txt (1.7M)
b.txt (5.1M)
c.txt (3.4 M)
d.txt (6.8M)
e.txt (10M)

步骤1: 虚拟存储划分过程
-划分原理, 处理每个文件时,依次和设置的虚拟存储切片最大值(4M)进行比较,如果不大于设置的最大值,逻辑上划分一个块。如果输入文件大于设置的最大值且大于两倍,那么以最大值切割一块;当剩余数据大小超过设置的最大值且不大于最大值2倍,此时将文件均分成2个虚拟存储块

虚拟存储过程
a.txt (1.7M) 因为 1.7 < 4 所以划分为一块
b.txt (5.1M) 因为 5.1 >4 并且小于( 2 x 4M) 所以平均划分两块. 即块1[0,2.55] 和 块2[2.56,5.1]
c.txt (3.4 M) 因为 3.4 < 4 所以划分为一块
d.txt (6.8M) 因为 6.8 >4 并且小于( 2 x 4M) 所以平均划分两块. 块1和 块2都是3.4M
e.txt (10M) 因为10> ( 2 x 4M) 所以 块1划分4M, 剩下的6M重复b.txt的切片规则, 块2和块3各划分为3M

根据上表,所以最终生成的虚拟存储文件块都有

1.7M
2.55M
2.55M
3.4M
3.4M
3.4M
4M
3M
3M

步骤2: 根据虚拟存储文件块结果进行切片

  • 1)判断虚拟存储的文件大小是否大于虚拟存储切片最大值,大于等于则单独形成个切片。
  • 2)如果不大于则跟下一个虚拟存储文件进行合并,共同形成一个切片

则经过合并后产生的了5个切片

(1.7 + 2.55)M
(2.55 + 3.4) M
(3.4 + 3.4) M
4M
(3 + 3) M

6.2 记录读取机制

  • 与TextInputFormat一样,都是将每个切片的内容按行读取输出的key为该行在整个文件中的起始字节偏移量, value为该行的内容

7、区别对比

实现类 切片机制 记录读取机制RecordReader 输出结果-(KeyIn,KeyOut)
TextInputFormat 按块Block切片 按行输出 (每行起始偏移量,每行内容)
KeyValueTextInputFormat 按块Block切片 按分隔符分割每行输出 (切割前部分, 切割后部分 )
NLineInputFormat 按行数N切片 按行输出 (每行起始偏移量,每行内容)
CombineTextInputFormat 按虚拟存储文件切片 按行输出 (每行起始偏移量,每行内容)

8、打赏

如果觉得文章有用,你可鼓励下作者

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_41347419/article/details/109059486