1 つの入力ファイルがあり、このファイル用に HDFS で作成された 3 つのブロックがあるとします。3 つのデータ ノードがあり、各データ ノードが 1 つのブロックを格納しているとします。3 つの入力分割がある場合、3 つのマッパーが並行して実行され、それぞれのデータ ノードに対してローカルなデータが処理されます。各マッパーは、入力形式とレコード リーダーを使用して、キーと値のペアに関して入力を取得します。レコードがファイルからの完全なテキスト行である TextInputFormat を使用したこのシナリオ。
ここで問題となるのは、最初のブロックの最後にレコード ブレークがあるとどうなるかということです。
1) このシナリオで、Hadoop はどのように完全なレコードを読み取りますか?
2) データ ノード 1 はデータ ノード 2 に接続して完全なレコードを取得しますか?
3) データ ノード 2 がデータの処理を開始し、最初の行で不完全なレコードを特定した場合はどうなりますか?
2651 次
3 に答える
4
- Hadoop は、EOL 文字または EOF に達するまで、最初のブロックの終わりを過ぎても読み取りを続けます。
- そのデータ ノードは、データ レプリケーション以外では相互に通信しません (名前ノードによって指示された場合)。HDFS クライアントは、ノード 1、次にノード 2 からデータを読み取ります
- 明確にするためのいくつかの例
- ブロックサイズが 128MB の 300MB のファイルにまたがる単一行のレコードがある場合、Mapper 2 と 3 はファイルの特定の分割オフセット (それぞれ 128MB と 256MB) から読み取りを開始します。どちらも次の EOL 文字を見つけようとして前方にスキップし、その時点からレコードを開始します。この例では、両方のマッパーが実際に処理するレコードは 0 です。
- 長さ 150MB、ブロックサイズ 128MB の 2 行を含む 300MB のファイル - マッパー 1 は最初の行を処理し、ブロック 2 で EOL 文字を見つけます。マッパー 2 はオフセット 128MB (ブロック 2) から開始し、前方にスキャンして EOL 文字を見つけます。オフセット 150MB で。順方向にスキャンし、ブロック 3 の後に EOF を見つけて、このデータを処理します。マッパー 3 は、オフセット 256MB (ブロック 3) で開始し、EOL 文字に到達する前に EOF まで順方向にスキャンするため、0 レコードを処理します。
- 各行の長さが 50MB の 6 行からなる 300MB のファイル:
- マッパー 1 - オフセット 0 -> 128MB、ライン 1 (0->50)、2 (50->100)、3 (100->150)
- マッパー 2 - オフセット 128 MB -> 256 MB、行 4 (150->200)、5 (200->250)、6 (250->300)
- マッパー 3 - オフセット 256 MB -> 300 MB、0 行
それが役立つことを願っています
于 2012-11-27T01:09:26.053 に答える
1
- Hadoopはノード2へのリモート読み取りを実行して、残りのレコードを取得します
- はい
- 私が理解していることから、ノード2は不完全なレコードを無視します
「Hadoop:The Definitive Guide」をお持ちの場合は、この正確な問題について説明している246ページ(最新版)をご覧ください(ただし、残念ながら簡単ですが)。
于 2012-11-26T13:45:40.280 に答える