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



根据我的理解,TextInputFormat应该在换行符处准确分割,但根据我在网站上看到的一些答案,我似乎错了。谁有更好的解释,哪个选项是正确的?

下列哪一项最好地描述了TextInputFormat的工作原理?

  1. 输入文件分割可能会交叉换行。

  2. 分隔符的RecordReader将读取穿过文件分隔符的行。
  3. 输入文件在换行符处精确分割,因此每个Record Reader将读取一系列完整的行。

  4. 输入文件分割可能会交叉换行。跨文件分割的行由分割的RecordReader读取,该分割包含折线的开头。

  5. 输入文件分割可能会交叉换行。

  6. 输入文件分割可能会交叉换行。

  7. 如果横贯文件分割,则由包含折线的两个分割的RecordReaders读取。

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

不可能总是使行尾与分割边界一致

查看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;
    }
  }

相关内容

  • 没有找到相关文章

最新更新