mapreduce的输入解析InputFormat及mapTask个数

1、InputFormat

InputFormat是mapreduce当中用于处理数据输入的一个组件,是最*的一个抽象父类,主要用于解决各个地方的数据源的数据输入问题。其中InputFormat的UML类图可以通过idea进行查看。

mapreduce的输入解析InputFormat及mapTask个数

2、FileInputFormat常用类

FileInputFormat类也是InputFormat的一个子类,如果需要操作hdfs上面的文件,基本上都是通过FileInputFormat类来实现的。

通过FileInputFormat来实现各种格式的文件操作,FileInputFormat的子实现类的UML类图如下:

mapreduce的输入解析InputFormat及mapTask个数

类名

主要作用

TextInputFormat

读取文本文件

CombineFileInputFormat

在MR当中用于合并小文件,将多个小文件合并之后只需要启动一个mapTask进行运行

SequenceFileInputFormat

处理SequenceFile这种格式的数据

KeyValueTextInputFormat

通过手动指定分隔符,将每一条数据解析成为key,value对类型

NLineInputFormat

指定数据的行数作为一个切片

FixedLengthInputFormat

从文件中读取固定宽度的二进制记录

 

3、MapTask的数量以及文件的输入切片机制

1、MapTask个数决定

mapreduce的输入解析InputFormat及mapTask个数

在MapReduce中,每个mapTask处理一个切片split的数据量(切片与block块的概念很像,但是block是hdfs存储数据的单位);

切片split是MapReduce中每个mapTask处理数据量的单位。

2、mapTask并行度的决定机制

数据块:block是hdfs物理上把数据分成一块一块;

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

查看FileInputFormat的源码,里面getSplits的方法便是获取所有的切片,其中有个方法便是获取切片大小

mapreduce的输入解析InputFormat及mapTask个数

切片大小的计算公式:

Math.max(minSize, Math.min(maxSize, blockSize));   

mapreduce.input.fileinputformat.split.minsize=1 默认值为1  

mapreduce.input.fileinputformat.split.maxsize= Long.MAXValue 默认值Long.MAXValue  

而blockSize为128M  

由以上计算公式可以推算出split切片的大小刚好与block块相等;

1、输入文件两个

file1.txt    300M

file2.txt    10M

2、经过FileInputFormat的切片机制运算后,形成的切片信息如下:

file1.txt.split1--  0~128

file1.txt.split2--  128~256

file1.txt.split3--  256~300

file2.txt.split1--  0~10M

一共就会有四个切片,与我们block块的个数刚好相等。

3、如何控制mapTask的个数

如果需要控制maptask的个数,我们只需要调整maxSize和minsize这两个值,那么切片的大小就会改变,切片大小改变之后,mapTask的个数就会改变;

maxsize(切片最大值):参数如果调得比blockSize小,则会让切片变小,而且就等于配置的这个参数的值。

minsize(切片最小值):参数调的比blockSize大,则可以让切片变得比blockSize还大。

4、使用CombineTextInputFormat实现切片个数控制

框架默认的TextInputFormat切片机制是对任务按文件规划切片,不管文件多小都会是一个单独的切,都会交给一个MapTask,这样如果有大量小文件,就产生大量的MapTask,处理效率极其低下。

1、应用场景:

CombineTextInputFormat用于小文件过多的场景,它可以将多个小文件从逻辑上规划到一个切片中,这样,多个小文件就可以交给一个MapTask处理。

2、虚拟存储切片最大值设置

CombineTextInputFormat.setMaxInputSplitSize(job, 4194304);// 4m

注意:虚拟存储切片最大值设置最好根据实际的小文件大小情况来设置具体的值。

3、切片机制

生成切片过程包括:虚拟存储过程和切片过程二部分。

mapreduce的输入解析InputFormat及mapTask个数

(1)虚拟存储过程:

将输入目录下所有文件大小,一次和设置的setMaxInputSplitSize值比较,如果不大于设置的最大值,逻辑上划分一个块。如果输入文件大于设置的最大值且大于两倍,那么以最大值切割一块;当剩余数据大小超过设置的最大值且不大于最大值2倍,此时将文件均分成2虚拟存储块(防止出现太小的切片)。

例如setMaxInputSplitSize值为4M,输入文件大小为8.02M,则先逻辑上分成一个4M。剩余的大小为4.02M,如果按照4M逻辑划分,就会出现0.02M的小的虚拟存储文件,所以将剩余的4.02M文件切分成(2.01M和2.01M)两个文件。

(2)切片过程:

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