2012-05-13 7 views
1

私はHadoopのJavaマップ/ reduce APIを学んでいて、map/reduceの考え方を頭に入れようとしています。map/reduceでランキングとソートをどのように実装しますか?

  1. 各IPアドレスにアクセスした回数をカウントします:ここで私は、Apache HTTPサーバのログファイルに対して書いているサンプルプログラムは、2つの相が(それぞれがM/Rジョブとして実装され、その後、互いに連鎖)は、ですサーバー
  2. フェーズ1は、それがマップに/削減し、それは次のようなものを発する簡単な集計の実装ですが、かなり些細なようで、トップ5のIPアドレス(ほとんどの要求を)検索:

    192.168.0.2 4 
    10.0.0.2 7 
    127.0.0.1 3 
    ...etc 
    

この出力は、2番目のmap/reduceジョブのマッパーに供給されます。

ここでは、トップ5を並列に実装する方法が混乱しています。減速機は本質的にシーケンシャルなので、ソートするには完全なリストに反する1つの減速機しかないと思いますよね?ステップ番号#2を並行して解決するにはどうしたらいいですか?すべての

答えて

1

まず、あなたがそれを並列化する必要がないことを十分に小さい最初の仕事の出力は、検討している場合:

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)、他のものは難しい(ソート、結合)でしょう。獣の性質だけ。

関連する問題