1 TB の並べ替えられていない単語カウント (word:count) があり、カウントが最大の単語を選択する map reduce ジョブを実行したいと考えています。この場合、これまでに最大の単語数を持つ単語を保持するすべての削減ジョブ間で共有される変数が必要です。reduce 関数はこの変数をチェックし、必要に応じて更新します。それは可能ですか?ありがとう
2 に答える
Mapreduceがどのように機能するかを誤解していると思います。Mapreduceモデルのメカニズムによって制限されますが、スループットを向上させるためにマシン間でメモリを正確に共有することはありません。
あなたが言っていることをするために、あなたは以下をするでしょう:
Map : (word, count) -> (KEY_CONSTANT, (count, word))
と
Combine/Reduce : (key, List<(count, word)>) -> (key, (count*, word*) with max count)
キーに追加count
するが、すべてが1つのパーティションにあることを確認する場合は、MapReduceにキーをcount
降順で並べ替えるように指示できます。次に、各リストの最初の値を調べるだけの個別のレデューサーを実装できます。ただし、入力がソートされていないコンバイナではこれを行うことはできません。残りのデータを読み取らないため、実装がかなり速くなる可能性があります。
ソートフェーズを効果的に使用する方法の詳細については、MapReduceフレームワークがソートフェーズをどのように実装するかを参照してください。
プロセスの一般的な説明: http://wiki.apache.org/hadoop/HadoopMapReduce
あなたは出来る
- レデューサーの数を 1 に設定します
- レデューサー クラスに 2 つのインスタンス変数を追加します。1 つはカウント用、もう 1 つは単語用です。これにより、最も頻繁に使用される単語に関する情報が保持されます。
- reduce setup() メソッドで変数を初期化する
- reduce() メソッドで、現在の単語が現在までに最も頻繁に出現した単語よりも多く出現しているかどうかを確認し、そうであれば、単語とカウントを変数に格納します
- cleanup() メソッドでは、変数にアクセスして、最も頻繁に使用される単語を取得できます
複数のレデューサーを実行する必要がある場合は、レデューサーの cleanup() メソッドを変更して、単語とそのカウントをキーと値のペアとしてコンテキストに書き出すようにします。上記の元のレデューサーに似た後続のレデューサーを使用すると、出現回数が最も多い単語を簡単に見つけることができます。