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)自定义实现类

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

     

 

posted @ 2020-03-18 12:44  拔丝小红薯  阅读(191)  评论(0编辑  收藏  举报