デフォルトでは、Hadoopは、ファイルのブロック境界でマッパーによって処理されるファイルを分割します。つまり、これがFileInputFormat実装がgetSplits()に対して行うことです。次に、Hadoopは、マッパーによって処理されるブロックが、マッパーが実行されているデータノードにレプリケートされていることを確認します。
ここで、このInputSplitの外部で読み取る必要がある場合(RecordReaderで、ただしそれは関係ありません)、InputSplitの内部で読み取るのとは対照的に、これにはどのようなコストがかかりますか?外部のデータがDatanodeを読んでいますか?
編集:
言い換える と、私はRecordReaderであり、1つのファイルブロックにまたがるInputSplitが割り当てられています。このファイルブロックのローカルコピーがありますが(実行しているデータノードにはあります)、ファイルの残りの部分はありません。ここで、このInputSplitの外部を読み取る必要があります。これは、最初にあるファイルヘッダーを読み取る必要があるためです。次に、ファイル内のレコードをスキップする必要があります(各レコードの長さを示すレコードヘッダーのみを読み取り、そのバイト数をスキップするよりも)。InputSplit内にある最初のレコードに遭遇するまで、これを行う必要があります。次に、InputSplit内の実際のレコードの読み取りを開始できます。これが、有効なレコード境界から開始することを確認する唯一の方法です。
質問:InputSplitの外部で読み取る場合、非ローカルファイルブロックからのデータはいつコピーされますか?これは一度に1バイトずつ実行されますか(つまり、InputStream.read()の呼び出しごとに1回)、またはInputStream.read()を呼び出すと、(現在のInputStream位置の)ファイルブロック全体がローカルデータノードにコピーされます。次の非ローカルファイルブロックなど?ファイルをスキップすることで生成されるオーバーヘッドを見積もるために、これを知る必要があります。
ありがとう :)