Hadoop RawLocalFileSystem和getPos

时间:2013-09-09 23:58:54

标签: hadoop recordreader

我发现RawLocalFileSystem的输入流中的getPos如果其底层流已关闭,则会抛出空指针异常。

我在玩自定义记录阅读器时发现了这一点。

要修补它,我只是检查对“stream.available()”的调用是否会抛出异常,如果是,则在getPos()函数中返回0。

现有的getPos()实现可在此处找到:

https://svn.apache.org/repos/asf/hadoop/common/branches/branch-0.20/src/examples/org/apache/hadoop/examples/MultiFileWordCount.java

RecordReader中getPos()的正确行为应该是什么?

1 个答案:

答案 0 :(得分:0)

RecordReader中的“getPos”随着时间的推移而发生了变化。

在旧的mapred RecordReader实现中,它用于计算读取的字节数。

  /** 
   * Returns the current position in the input.
   * 
   * @return the current position in the input.
   * @throws IOException
   */
  long getPos() throws IOException;

在较新的mapreduce RecordReader实现中,RR类不提供此信息,而是它是FSInputStream实现的一部分:

class LocalFSFileInputStream extends FSInputStream implements HasFileDescriptor {
private FileInputStream fis;
private long position;

public LocalFSFileInputStream(Path f) throws IOException {
  this.fis = new TrackingFileInputStream(pathToFile(f));
}

@Override
public void seek(long pos) throws IOException {
  fis.getChannel().position(pos);
  this.position = pos;
}

@Override
public long getPos() throws IOException {
  return this.position;
}

因此,使用新的mapreduce API,RecordReader被抽象为不一定返回getPos()。可以重写可能想要使用此底层实现的RecordReader的较新实现,以直接使用FSInputStream对象,这些对象确实提供了getPos()。