まず、あなたがそれを並列化する必要がないことを十分に小さい最初の仕事の出力は、検討している場合:
hadoop fs -cat joboutput/part-* | sort -k2 -n | head -n5
これはおそらく、多くの中で1つの減速にすべてを送信するよりも速くなりますケース!
ハイドロップでのソートは、1つのレデューサーのみを使用しないようにするとかなり難しいです。並べ替えに興味がある場合は、TotalOrderPartionerをチェックしてみてください。 Webを検索することで、いくつかの例を見つけてください。基本的な解決策は、パーティションにあなたの値をカスタムパーティショナーを持つ昇順の値のビンに入れなければならないことです。次に、各ビンは自然にソートされます。あなたは出力し、あなたはソートされたセットを持っています。
難しい部分は、ビンにどのようにデータを入れるかを考え出すことです。
あなたは、特に、トップ5に興味がある場合(またはトップ50、何でも)、それを行うための興味深い方法があります。基本的な前提は、各マッパーのトップ5を取って、レデューサーのトップ5のトップ5を取ることです。各マッパーは効果的にトップ5をレデューサーに送り、トーナメントのような真のトップ5を競うことができます。あなたは減速機のトップ5を得ることが保証されています、あなたはそれらのいくつかを除外する必要があります。
マッパーとレデューサーの両方でトップ5を記録するには、TreeMap
を使用します。基本的には、値を挿入したまま、先頭に5を切り捨ててください。Mapper#cleanup
メソッドでは、上位5個のレコードを書き出します(map
の間に書き出さないでください)。減速機についても同じ操作を行います。
ここでは、このような目的でApache Pigを接続します。上記のオプションと同じくらい効果的ではないかもしれませんが、コード作成は簡単です。
loaded = LOAD 'joboutput/' USING PigStorage('\t') AS (ip:chararray, cnt:int);
sorted = ORDER loaded BY cnt DESC;
top = LIMIT sorted 5;
dump top;
並べ替えのような単純なものは、あなたがHadoopの中で想像したかもしれないほど単純ではないことを申し訳ありません。いくつかのことは容易になるでしょう(例えば、あなたがやったことを数えるip)、他のものは難しい(ソート、結合)でしょう。獣の性質だけ。