Hadoop MapReduce TextInputFormat - 如何完成文件分割

时间:2015-10-21 19:28:26

标签: hadoop split mapreduce

根据我的理解TextInputFormat应该在换行符时完全分开,但根据我在网站上看到的一些答案,我觉得我错了。有没有人有更好的解释,哪个选项是对的?

以下哪项最能说明TextInputFormat的工作原理?

  1. 输入文件拆分可能会跨越换行符。跨越文件拆分的行由包含折线末尾的拆分的RecordReader读取。

  2. 输入文件在换行符处完全分割,因此每个Record Reader都会读取一系列完整的行。

  3. 输入文件拆分可能会跨越换行符。跨越文件拆分的行由包含折线开头的拆分的RecordReader读取。

  4. 输入文件拆分可能会跨越换行符。将忽略跨越tile分割的行。

  5. 输入文件拆分可能会跨越换行符。跨越文件拆分的行由包含虚线的两个拆分的RecordReaders读取。

2 个答案:

答案 0 :(得分:3)

选项 1。是正确的。第一次拆分的最后一行将是第一次拆分的一部分,即使这会导致远程读取并遭受数据局部性问题。

并不总是可以让线的末端与分割边界重合。

答案 1 :(得分:0)

查看TextInputFormat

的文档页面
  

纯文本文件的InputFormat。文件分为几行。换行或回车用于发出行尾信号。键是文件中的位置,值是文本行。

检查TextInputFormat @ grepcode的实现(选项1似乎是正确的方法)

@Override
  public RecordReader<LongWritable, Text> 
    createRecordReader(InputSplit split,
                       TaskAttemptContext context) {
    return new LineRecordReader();
  }

LineRecordReader

 public boolean nextKeyValue() throws IOException {
    if (key == null) {
      key = new LongWritable();
    }
    key.set(pos);
    if (value == null) {
      value = new Text();
    }
    int newSize = 0;
    while (pos < end) {
      newSize = in.readLine(value, maxLineLength,
                            Math.max((int)Math.min(Integer.MAX_VALUE, end-pos),
                                     maxLineLength));
      if (newSize == 0) {
        break;
      }
      pos += newSize;
      if (newSize < maxLineLength) {
        break;
      }

      // line too long. try again
      LOG.info("Skipped line of size " + newSize + " at pos " + 
               (pos - newSize));
    }
    if (newSize == 0) {
      key = null;
      value = null;
      return false;
    } else {
      return true;
    }
  }