MapReduce_input阶段
Input阶段作用有两个,一是读取数据,二是对数据进行切片划分。
一、读取数据:Input是读取数据的总接口,默认使用FileInputFomart类。
二、(1)切片划分:将要处理的数据进行逻辑上的切片划分,每一个切片都对应一个mapTast任务。也就是说,将数据切成几片,就有几个mapTast任务。
默认的切片大小默认是block块的大小,它切分时是按照每一个文件来切的,而不是整个数据。
(2)FileInputFormat中计算切片大小的公式:
Math.max(minSize,Math.min(maxSize,blockSize));
minSize默认为1。
所以,想要调整切片的大小的话,调整maxSize的大小就可以了。
(3)CombineTextInputFormat
因为FileInputFomart切片是以每个文件来划分切片的,那么每个文件不管多大至少都会划分一个切片。假如有非常多的小文件的话会启动非常的的
mapTast,不划算,所以就有了CombineTextInputFormat。它可以将多个小文件从逻辑上规划到一个切片中,这样,多个小文件就能交给一个MapTast
来处理了。
在驱动类代码中添加以下代码实现:
CombinTextInputFormat.setMaxInputSplitSize(job,虚拟存储切片最大值)
job.setInputFormatClass(CombineTextInputFormat.class);
三:FileInputFomart的实现类
因为读取的数据的类型不同(日志文件、二进制格式文件、数据库表等等),所以FileInputFomart有多个实现类来处理不同类型的数据,甚至可以自定义实现类。
(1)TextInputFomart
TextInputFomart是默认的FileInputFormat实现类。按行读取每条记录。键是存储该行在整个文件中的起始字节偏移量,是LongWritable类型。值是
这行内容,不包括任何终止符(换行和回车)
(2)KeyValueTextInputFomart
每一行均为一条记录,被分隔符分割为key和value。可以在驱动类里设置conf.set(KeyValueLineRecordReader.KEY_VALUE_SEPERATOR,"\t")
来设定分隔符。默认分隔符是tab。
关键代码:(1)设置mapper的输入k和v都是text
(2)在驱动类的Configuration对象上设置切割符
new Configuration().set(KeyValueLineRecordReader.KEY_VALUE_SEPERATOR,切割符)
(3)在驱动类里设置输入格式
job.setInputFormatClass(KeyValueTextInputFormat.class);
(3)NLineInputFormat
如果使用NLineInputFormat,那么每个切片不在按照block块去划分,而是按照NLineInputFormat指定的行数N来划分。输入文件的总行数/n=切片数,
如果不整除,切片数=商+1。键值对的生成和TextInputFormat一样。
关键代码:(1)设置输入处理方式
job.setInputFormatClass(NLineInputFormat.class);
(2)设置每个切片划分多少记录
NLineInputFormat.setNumLinesPerSplit(job,3);
(4)自定义实现类