2017-03-02 10 views
0

たとえば、巨大な名前ファイルに含まれる名前を数えたいとしましょう。ファイルを複数のチャンクに簡単に分割して、マッパーに送信し、マッパーは単一のリデューサーに出力します。マッパーは結果のリストを含む単一のファイルを出力します。それはかなりきれいに聞こえる!MapReduceフレームワークで2つ(またはそれ以上)のレデューサーを使用する理由は何ですか?

今、2人(またはそれ以上)のレデューサーがこのプロセスをより速くする方法を教えてください。私が知っている限り、すべてのマッパーはすべての単一の減速機に自分のデータを送信して減速させ、すべての減速機はその結果で自分のファイルを出力します。したがって、例えば2つの減速機を備えた仕事では、システム内で転送されるデータに減速機の数が乗算され、すべての減速機の出力はまったく同じになります(うまくいけば)。それ以外の場合には、複数のレデューサーを持たせる価値はありますか?

私は何かが不足しているようですが、このトピックに関する小さな説明やガイダンスを本当にうれしく思います。御時間ありがとうございます。

+1

私はあなたがMapReduceについて混乱していると思います。 2つ以上の減速機を持つという考え方は、すべての情報を送信している1台のマシンを崩壊させたくないからです。だから、もともと1レデューサーに10レコードを送っていたら、2レデューサーがあれば、5レコードずつ送信されます(最高の場合、あなたのハッシュ関数に依存します)。 – dbustosp

+0

答えをありがとう。だから、私の例で2つの減速機を使いたいのであれば、カスタムパーティションを使ってマッパーから出力されたデータを分割するだけで、すべての減速機がそのシェアを得ることになります(2つのシステムがそれぞれ独自のデータセットを減らすのと同じです)最終的には !このため、パフォーマンスが向上します。これまでの私の推論は正しいのでしょうか? – Nick

答えて

1

あなたの混乱については、MapReduceがどのように機能するかについてです。私はあなたが持っている疑いを明確にするために小さな説明をするためにあなたが提供する同じ例に従おうとします。

2つ以上のレデューサーを持つという考え方は、すべての情報を送信する1台のマシンを崩壊させたくないからです。だから、もともと1つのレデューサーに10レコードを送っていたら、今度は2レデューサーがあれば、プロセスはそれぞれ5レコードを送信します(最良のケースは、あなたのハッシュ関数に依存します)。すべての減速機は、データのそれ自身のシェアを得るでしょう。あなたが提供する同じ例に従い

、マッパーのようなタプル送信されるように、あなたが結合器を使用しているとしましょう(私たちはコンバイナを使用することができます知っているが、それは単なる例です):

(ジョセフ、1) (ジョージ、1、) (アンドリュー、1) (ジョセフ、1) (ジョージ、1、) (アンドリュー、1) (アニバル、1) (メアリー、1、) (アンドリュー、1) (Michael、1)

1Reducerを使用すると、これらのレコードはすべて同じ減速へのENTは、単一の出力は次のようになりますので:

> 10 

あなたは、のようなものデータの独自のシェアを取得する最良の場合には、すべての減速を2Reducersを使用している場合:

Reducer1 
(Joseph, 1) 
(Joseph, 1) 
(Andrew, 1) 
(Andrew, 1) 
(Andrew, 1) 

Reducer2 
(George, 1,) 
(George, 1,) 
(Anibal, 1) 
(Mary, 1,) 
(Michael, 1) 
を私は鍵が見つかっ 名前と出力されることを想定しています

> 5 
> 5 

注:あなたがなり2つの出力を、取得します。このケースでは

あなたが望むのは、ファイル内の名前の数を数えるだけです。

0

@dbustospが非常によく説明されています。

疑問を解消する図を追加したいと思います。

enter image description here

あなたはまた、減速機側で並列処理を実現している上記の図から見ることができます。それはあなたに単一の減速機に比べて高いスループットを与えるでしょう。

関連する問題