Hadoop的InputFormat抽象类源码解析

InputFormat抽象类源码解析
--------------------------
    0.做两件事:【进行逻辑切分InputSplit;创建RecordReader】
    1.抽象方法:List getSplits(JobContext context)
       说明:逻辑地分割作业的输入文件集-->InputSplit。然后将每个InputSplit分配给一个单独的Map进行处理
    2.抽象方法:RecordReader createRecordReader(InputSplit split,TaskAttemptContext context)
       说明:为给定的切分创建一个记录读取器。框架将调用RecordReader#initialize(InputSplit, tasktrytcontext)}使用分割。
    3.默认加载的类为FileInputFormat(抽象类)
      FileInputFormat
      ------------------------------------------
         说明:基于文件的输入格式的基类。FileInputFormat是所有基于文件的inputformat的基类。
           FileInputFormat的子类还可以覆盖isSplitable(JobContext, Path)方法,以确保输入文件不被分割,并由map作为一个整体进行处理。
         1.计算split:
       getSplit()-->【获取最小值:1】minSize = Math.max(getFormatMinSplitSize(), getMinSplitSize(job));
                     -->【获取最大值:Long.MAX_VALUE】maxSize = getMaxSplitSize(job);
                     -->【获取文件信息和blockLocation】...
                     -->【获取文件的block大小】blockSize = file.getBlockSize();
             -->【计算splitsize切分大小】splitSize = computeSplitSize(blockSize, minSize, maxSize);
                 -->Math.max(minSize, Math.min(maxSize, blockSize));
                 说明:a.先将块大小与默认最大值大小做比较,取小值;结果为128m
                       b.将上一步的计算结果与输入文件的最小值比较,取大值,结果为128m;
                 总结:默认情况下,split切分大小与block大小相同;
             -->【计算生成InputSplit(FileSplit),并添加至List中】
     
         2.相关属性:
       【mapred-site.xml】:mapreduce.input.fileinputformat.split.minsize = 0
          说明:默认设置文件输入切分最小值为0
       【FileInputFormat.class】:mapreduce.input.fileinputformat.split.maxsize = Long.MAX_VALUE
              说明:默认设置文件输入切分最大值为long最大值
           【FileInputFormat.class】:mapreduce.input.fileinputformat.input.dir.recursive = false
          说明:默认情况下不允许输入路径递归;可以调用FileInputFormat.setInputDirRecursive(job, true)
           【mapred-site.xml】:mapreduce.input.fileinputformat.list-status.num-threads = 1
        用于列出和获取块位置的线程数。对于指定的输入路径
         3.默认将“_”和“.”开头的文件过滤掉;


split切分规则,计算splitsize
----------------------------------------------------------
    最小值           最大值          块大小           切分大小
    minSize         maxSize         blocksize        splitsize  
1.     1         Long.MAX_VALUE        128m             128m
    【默认情形】
2.     1         Long.MAX_VALUE        256m             256m
    【修改块大小】
3.     1             64m               128m             64m 
    【修改mapreduce.input.fileinputformat.split.maxsize大小】
4.    130m       Long.MAX_VALUE        128m             130m
    【修改mapreduce.input.fileinputformat.split.minsize大小】


Recordreader源码分析
-----------------------------------------
    TextInputFormat做说明:
    ---------------------------------------
       1.用于纯文本文件的InputFormat子类。文件被分解成行;换行或回车都用来表示每行的结尾。键是文件中的偏移量和值是行的文本。
       2.isSplitable()-->判定是否可被切分:纯文本或bzip2压缩格式可切分,其余方式均不可以。
       3.createRecordReader(InputSplit split,TaskAttemptContext context)
          -->new LineRecordReader(recordDelimiterBytes)
          【LineRecordReader.class】:将键视为文件中的偏移量,将值视为行 
          -->属性:mapreduce.input.linerecordreader.line.maxlength = Integer.MAX_VALUE
          -->initialize()
             -->SplitLineReader in  【构建org.apache.hadoop.util.LineReader】
         org.apache.hadoop.util.LineReader.class 
            -->默认按“\r”,"\n","\r\n"进行处理

你可能感兴趣的:(Hadoop)