1

3 つのレデューサーがあり、それぞれが同じキーを受け取る必要があります。次のようにします。

GOOG - Reducer 0
AAPL - Reducer 1
VMW - Reducer 2

パーティショナーでは、getPartition() メソッドは、(0,1,2) のいずれかのレデューサーのインデックスを示す int を返す必要があります。

私が持っている getPartition() の実装は次のとおりです。

return ((CompositeKey) key).getSymbol().hashCode() % numReduceTasks;

ただし、これはここでは機能していません。

 int numReduceTasks = 3;
 System.out.println("GOOG".hashCode() % numReduceTasks);//output: 0
 System.out.println("AAPL".hashCode() % numReduceTasks);//output: 1
 System.out.println("VMW".hashCode() % numReduceTasks);//output:  1

だから私が得る出力ファイルで

.../part-r-00000

GOOG

.../part-r-00001

AAPL
VMW

.../part-r-00002

<empty>

問題は、これをどのように修正するかです。つまり、同じキーが同じリデューサーに送られることを保証するパーティショナー関数をどのように作成すればよいでしょうか。

4

1 に答える 1

1

コードは、誰もが期待するとおりに正確に機能しています。ハッシュ コードを使用していますが、これはランダムであり、%3 を実行したときに、それらが異なる値を与えることを保証することはできません。これを行う方法として私が考える唯一の方法は、決定論的な決定を行う一連の if ステートメントを使用することです。

if GOOG: return 0
if AAPL: return 1
if VMW: return 2

アドバイス: MapReduce で「既成概念にとらわれない」ことは危険なゲームです。MapReduce を使用する最善の方法は、ルールに従ってプレイすることであり、利点を継承します。いつでもできるとは限りませんが、常に試してみてください。

于 2013-11-02T19:35:33.477 に答える