5

特定のキーに対して1つだけを使用するようにmapReduceフレームワークを強制する必要がある時点で、私は本当に行き詰まっています。reducerまた、フレームワークがキーをソートする方法にも影響を与えたいと考えています。例で問題を紹介します。

次の形式でキーと値のペアを発行したいと思います。

< bxb > : < d1 >
< bx > : < d2 >
< b > : < d3 >
< bax > : < d2, d3 >
図1

キーはシーケンスです-ご覧のとおり-、それぞれがアイテムbで始まり、これは data type になりstringます。値はObjectID、文字dと数字で示されるように s になります。関数から発行する他のキーと値のペアがあります。これは、 aまたはxmapなど、キーの別の項目で始まります。

< abx > : < d1 >
< ax > : < d3 >
< xaa > : < d3 >
図 2

reduce特定のアイテムで始まるキーと値のペアごとに1 つの関数を呼び出すように、フレームワークを強制する必要があります。mapまた、 と の間でソートを強制しreduce、逆の辞書式順序でキーをソートする必要があります。したがって、単一のレデューサーは、アイテムbに対して次のキーと値のペアを受け取ります。

< bxb > : < d1 >
< bx > : < d2 >
< bax > : < d2, d3 >
< b > : < d3 >
図3

私が試したこと:

次の形式でキーと値のペアを発行しようとしました。

b : < (d1 : < bxb >) >
b : < (d2 : < bx >) >
b : < (d3 : < b >) >
b : < (d2 : < bax >), (d3 : < bax > ) >
図 4

このようにして、単一のレデューサーがアイテムbの値を受け取りましたが、逆の辞書式順序ではなく、最悪の部分は、単一のレデューサーが特定のキーのすべての値を取得するという保証がないことです ( MongoDB の MapReduce のように)ドキュメンテーション状態)。

基本的には、特定のアイテムで始まるこれらのシーケンスを逆辞書式順序で処理する必要があります。

私をさらに解決に導くアイデアはありません。キーに単一のレデューサーを適用し、並べ替えに影響を与えるにはどうすればよいですか? ニーズを満たすために渡される (発行される)データ構造をどのように設計すればよいですか?

Comparatorこれらの機能は、Hadoop のおよびに似ていPartitionerます。

アップデート - - - - - - - - - - - - - - - - - - - - - - - - - -------------------------------------------------- ----------------------

finalizeキーごとに 1 回だけ実行される Asya Kamsky によって指摘されたので、特定のキーの単一のレデューサーですべての値を確認する必要がある場合に、パーティショニングの問題が解決されます。

並べ替えはまだ問題です。大規模なデータセットの場合、内部に独自の並べ替えを実装すると、実行時間の点で大きなボトルネックになりますが、 とfinalizeの間の自然な並べ替えメカニズムは利用していません。キーは data typeですが、逆ソートを強制するためにそれらをネガティブにエンコードするのは簡単です。mapreducestringintegers

図 3をもう一度確認してみましょう。

< bxb > : < d1 >
< bx > : < d2 >
< bax > : < d2, d3 >
< b > : < d3 >
図3

これは、 a がキーbfinalizeに対して受け取る必要があるものです。たとえば、キーはここでは複合です。Finalize はbで始まるキーを受け取る必要がありますが、キーの他の部分については逆の辞書式順序で受け取ります。< b x b >

これを達成し、内部でソートを回避する方法はありますfinalizeか?

4

1 に答える 1