zoukankan      html  css  js  c++  java
  • InputFormat抽象类源码分析

    InputFormat抽象类源码解析
    --------------------------
    0.做两件事:【进行逻辑切分InputSplit;创建RecordReader】
    1.抽象方法:List<InputSplit> getSplits(JobContext context)
    说明:逻辑地分割作业的输入文件集-->InputSplit。然后将每个InputSplit分配给一个单独的Map进行处理
    2.抽象方法:RecordReader<K,V> 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
    -->默认按“ ”," "," "进行处理


     

     

     

  • 相关阅读:
    GDUFE ACM-1093
    GDUFE ACM-1088
    GDUFE ACM-1069
    GDUFE ACM-1051
    GDUFE ACM-1049
    GDUFE ACM-1046
    GDUFE ACM-1045
    GDUFE ACM-1043
    OpenCV学习(7.12)
    OpenCV学习(7.11)
  • 原文地址:https://www.cnblogs.com/lyr999736/p/9250963.html
Copyright © 2011-2022 走看看