6

Mapper から得た出力に少し混乱しています。

たとえば、次の入力テキストを使用して単純なワードカウント プログラムを実行すると、次のようになります。

hello world
Hadoop programming
mapreduce wordcount
lets see if this works
12345678
hello world
mapreduce wordcount

これは私が得る出力です:

12345678    1
Hadoop  1
hello   1
hello   1
if  1
lets    1
mapreduce   1
mapreduce   1
programming 1
see 1
this    1
wordcount   1
wordcount   1
works   1
world   1
world   1

ご覧のとおり、マッパーからの出力は既にソートされています。私はまったく走りませんでしたReducer。しかし、別のプロジェクトで、マッパーからの出力がソートされていないことがわかりました。だから私はこれについて完全に明確です..

私の質問は次のとおりです。

  1. マッパーの出力は常にソートされていますか?
  2. 並べ替えフェーズはすでにマッパー フェーズに統合されているため、マップ フェーズの出力は中間データで既に並べ替えられていますか?
  3. フェーズからデータを収集し、sort and shuffleReducer に送られる前に保持する方法はありますか? レデューサーには、キーとイテラブルのリストが表示されます。このデータを永続化する方法はありますか?
4

5 に答える 5

9

マッパーの出力は常にソートされていますか?

いいえ。reducer を使用しないとソートされません。レデューサーを使用する場合、マッパーの出力がディスクに書き込まれる前に事前ソート プロセスがあります。データは Reduce フェーズでソートされます。ここで起こっていること (単なる推測) は、新しい API で Identity Reducer を使用するように変換される Reducer クラスを指定していないことです (この回答とコメントを参照)。Identity Reducer はその入力を出力するだけです。それを確認するには、デフォルトの Reducer カウンターを参照してください (いくつかの削減タスク、入力レコードとグループの削減、出力レコードの削減...)

並べ替えフェーズはすでにマッパー フェーズに統合されているため、マップ フェーズの出力は中間データで既に並べ替えられていますか?

前の質問で説明したように、レデューサーを使用しない場合、mapper はデータを並べ替えません。レデューサーを使用する場合、データは map フェーズからソートされ始め、reduce フェーズでマージソートされます。

並べ替えおよびシャッフル フェーズからデータを収集し、Reducer に移動する前に保持する方法はありますか。レデューサーには、キーとイテラブルのリストが表示されます。このデータを永続化する方法はありますか?

繰り返しますが、シャッフルとソートはリデュース フェーズの一部です。Identity Reducer は、あなたが望むことを行います。リデューサーごとに 1 つのキーと値のペアを出力し、値がイテラブルの連結である場合は、イテラブルをメモリ (たとえば、StringBuffer) に保存してから、この連結を値として出力します。縮小フェーズを経ずにマップ出力をプログラムの出力に直接送りたい場合は、次のようにドライバ クラスで縮小タスクの数を 0 に設定します。

job.setNumReduceTasks(0);

ただし、これでは出力がソートされません。マッパーのソート前処理をスキップし、出力を HDFS に直接書き込みます。

于 2014-07-17T08:22:20.300 に答える