2

デフォルトでは、Hadoopは、ファイルのブロック境界でマッパーによって処理されるファイルを分割します。つまり、これがFileInputFormat実装がgetSplits()に対して行うことです。次に、Hadoopは、マッパーによって処理されるブロックが、マッパーが実行されているデータノードにレプリケートされていることを確認します。

ここで、このInputSplitの外部で読み取る必要がある場合(RecordReaderで、ただしそれは関係ありません)、InputSplitの内部で読み取るのとは対照的に、これにはどのようなコストがかかりますか?外部のデータがDatanodeを読んでいますか?

編集:

言い換える と、私はRecordReaderであり、1つのファイルブロックにまたがるInputSplitが割り当てられています。このファイルブロックのローカルコピーがありますが(実行しているデータノードにはあります)、ファイルの残りの部分はありません。ここで、このInputSplitの外部を読み取る必要があります。これは、最初にあるファイルヘッダーを読み取る必要があるためです。次に、ファイル内のレコードをスキップする必要があります(各レコードの長さを示すレコードヘッダーのみを読み取り、そのバイト数をスキップするよりも)。InputSplit内にある最初のレコードに遭遇するまで、これを行う必要があります。次に、InputSplit内の実際のレコードの読み取りを開始できます。これが、有効なレコード境界から開始することを確認する唯一の方法です。

質問:InputSplitの外部で読み取る場合、非ローカルファイルブロックからのデータはいつコピーされますか?これは一度に1バイトずつ実行されますか(つまり、InputStream.read()の呼び出しごとに1回)、またはInputStream.read()を呼び出すと、(現在のInputStream位置の)ファイルブロック全体がローカルデータノードにコピーされます。次の非ローカルファイルブロックなど?ファイルをスキップすることで生成されるオーバーヘッドを見積もるために、これを知る必要があります。

ありがとう :)

4

2 に答える 2

2

In best of my understanding if data is not resided on local datanode - it will not be involved in reading it. HDFS client will ask NameNode where blocks are sitting and will directly speak with relevant datanodes in order to get the blocks.
So cost will be - on remote datanode : read from disk, calculate CRC, send to the network, on code reading data - get from the network.
I think cluster-wise price is only network bandwidth and some CPU spent on sending, receiving.

于 2012-12-12T11:14:43.207 に答える
0

データの移動は通常、2つのシナリオで発生します。まず、InputSplitのサイズがブロックサイズより大きい場合。次に、ブロックを保持しているノードにTaskTrackerを開始するための空きスロットがない場合。この場合、ブロックは空きスロットがある別のノードに移動されます(できれば同じラック内にあります)。

于 2012-12-13T10:33:45.930 に答える