2016-06-17 1 views
2

私は、テキスト(フルーツ名)キーとカスタム合成値city:countを発行するマッパーを持っています。私は、減速機に到着する前にカウントで複合値をソートして、減速機が最も高いカウントを持つ都市を迅速に判断できるようにします。Java Mapreduceソートコンポジット値

複合価値クラスは、WritableComparableの拡張であり、カウントと都市を取得するためのメソッドを備えています。

何私の減速が現在受信:

reducer 1 - oranges:<london:2, chicago:15, charleston:6> 
reducer 2 - apples:<charleston:31, london:3, chicago:29> 
... 

を、私は私の減速を受信したいこと:論理的に

reducer 1 - oranges:<chicago:15, charleston:6, london:2> 
reducer 2 - apples:<charleston:31, chicago:29, london:3> 

、どのように私はこれを実現するのですか?私はSecondary Sorting/Orderingに関するいくつかの記事を読んだことがありますが、複合値とは対照的に複合キーに注目する傾向があります。私のキーは、さらに分割する必要もなく、さらにソートする必要もありません。

コンポジットキーではなく、複合VALUEでソートします。

+0

[hadoop map reduce secondary sorting]の可能な複製(http://stackoverflow.com/questions/18395998/hadoop-map-reduce-secondary-sorting) –

答えて

1

果物の最高量を迅速に決定することを目指しているのであれば、別の方法をお勧めしたいと思います。ほとんどの場合ソートはO(n log n)の複雑さを持っていますが、最大のエントリを見つけるにはO(n)しかありません。ここで、nはあなたのケースの都市の数です。メモリ

1.マッパーは、あなたは、マッパーごとに各果物の最高額を決定するために、各マッパーでハッシュマップを使用することができます。果物をキーと都市+価値としてカウントするだけです。より大きなものを比較するために、あなたが果実を地図に見るとき。果物がまだ存在していない場合は、明らかにそれを設定する必要があります。 すべてのマップステップが実行されると、フレームワークはマッパーのクリーンアップメソッドを呼び出します。クリーンアップでは、マップのエントリを出力できます。これにより、レデューサーで送信して通過する必要がある値の数が大幅に削減されます。

2.コンバイナ

アプローチ1.バック1つの重大なドローを持っています。メモリに収まらない果物が多い場合はスケーラビリティがありません。この場合、マッパー側で実行されるコンバイナを使用することができます。それは対応するマッパーによって与えられたより小さなデータセットのための減速器のように働く。これはまた、あなたが還元剤に送る値の数が減少するという利点につながります。

3.あなたは二次の順序でそれを行うことができます

オーダーセカンダリ。 Preeti Khuranaが提供する記事を読むことを本当にお勧めします。特にanswer of Sudarshanです。あなたに簡単なアイデアを伝えてみましょう:fruit:countとcity:countの複合キーを使いましょう。キーの最初の部分に基づいて特別なパーティショニングが必要であることに注意してください。私はこれが大量の努力だと思っていますが、場合によっては有用で必要なものです。

関連する問題