web-dev-qa-db-ja.com

Hadoop Map Reduceコードによる上位N値

私はHadoopの世界で非常に新しく、1つの簡単なタスクを達成するために苦労しています。

誰でも、マップ削減コード手法のみを使用して、Wordカウントの例の上位n値を取得する方法を教えてもらえますか?

この単純なタスクにhadoopコマンドを使用したくありません。

14
user3078014

2つの明白なオプションがあります。


2つのMapReduceジョブがあります。

  1. WordCount:すべての単語を数えます(かなり正確に例を示します)
  2. TopN:何かの上位Nを見つけるMapReduceジョブ(ここにいくつかの例があります: ソースコードブログ投稿

WordCountの出力をHDFSに書き込みます。次に、TopNにその出力を読み取らせます。これはジョブチェーンと呼ばれ、この問題を解決する方法はいくつかあります。oozie、bashスクリプト、ドライバーから2つのジョブを起動するなどです。

2つのジョブが必要な理由は、2つの集計を行うためです。1つはワードカウントで、もう1つはtopNです。通常、MapReduceでは、各集計に独自のMapReduceジョブが必要です。


まず、データに対してWordCountジョブを実行します。次に、bashを使用して上位Nを引き出します。

hadoop fs -cat /output/of/wordcount/part* | sort -n -k2 -r | head -n20

sort -n -k2 -rは、「列#2の降順で数値順に並べ替える」と言います。 head -n20上位20を引き出します。

これはWordCountのより良いオプションです。WordCountはおそらく数千または数万行のオーダーでしか出力せず、そのためのMapReduceジョブは必要ないからです。 Hadoopを使用しているからといって、Hadoopですべての問題を解決する必要があるわけではないことに注意してください。


わかりにくいバージョンですが、トリッキーですが、上記の両方を組み合わせたものです...

WordCount MapReduceジョブを記述しますが、Reduceで、前に示したTopN MapReduceジョブのようなものを実行します。次に、各レデューサーがそのレデューサーからのTopN結果のみを出力するようにします。

したがって、トップ10を実行している場合、各レデューサーは10個の結果を出力します。 30のレデューサーがある場合、300の結果を出力するとします。

次に、bashでオプション#2と同じことを行います。

hadoop fs -cat /output/of/wordcount/part* | sort -n -k2 -r | head -n10

結果の一部のみを後処理しているため、これはより高速になるはずです。

これは私がこれを行うと考えることができる最も速い方法ですが、おそらく努力する価値はありません。

20
Donald Miner