特定のキーに対して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ですが、逆ソートを強制するためにそれらをネガティブにエンコードするのは簡単です。map
reduce
string
integers
図 3をもう一度確認してみましょう。
< bxb > : < d1 >
< bx > : < d2 >
< bax > : < d2, d3 >
< b > : < d3 >
図3
これは、 a がキーbfinalize
に対して受け取る必要があるものです。たとえば、キーはここでは複合です。Finalize はbで始まるキーを受け取る必要がありますが、キーの他の部分については逆の辞書式順序で受け取ります。< b x b >
これを達成し、内部でソートを回避する方法はありますfinalize
か?