0

RawLocalFileSystem の入力ストリームの getPos は、基になるストリームが閉じている場合に null ポインター例外をスローする可能性があることがわかりました。

カスタム レコード リーダーで遊んでいるときに、これを発見しました。

パッチを適用するには、「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() の正しい動作は何ですか?

4

1 に答える 1

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() が返されるとは限りません。この基礎となる実装を使用する可能性のある RecordReaders の新しい実装は、getPos() を提供する FSInputStream オブジェクトを直接使用するように書き直すことができます。

于 2013-12-20T16:14:31.447 に答える