19

MapReduce プログラミング モデル全般についてはかなり理解していると思いますが、元の論文やその他の情報源を読んでも、特に中間結果の分割に関して、多くの詳細が不明です。

これまでの MapReduce についての私の理解を簡単に要約します。潜在的に非常に大きな入力データ セットがあり、MR-Framework によって M 個の異なる断片に自動的に分割されます。ピースごとに、フレームワークは 1 つのマップ タスクをスケジュールします。このタスクは、クラスター内の使用可能なプロセッサ/マシンの 1 つによって実行されます。M 個のマップ タスクのそれぞれがキーと値のペアのセットを出力します。これは、このマップ タスクを実行したのと同じマシンにローカルに保存されます。各マシンはディスクを R パーティションに分割し、中間キーに基づいて計算された中間キーと値のペアをパーティション間で分散します。次に、フレームワークは、個別の中間キーごとに 1 つの削減タスクを開始します。このタスクは、使用可能なマシンのいずれかによって再度実行されます。

今私の質問は次のとおりです。

  1. 一部のチュートリアルでは、map タスクと reduce タスクが並行して実行される可能性があるようです。これは正しいですか?それぞれの個別の中間キーに対して、reduce タスクが 1 つだけ開始されると仮定すると、どうしてでしょうか? 最初の reduce タスクを開始する前に、最後の map タスクが完了するまで待つ必要はありませんか?
  2. 個別の中間キーごとに 1 つの reduce タスクがあるため、各 reduce タスクが実行中のマシンに対応するパーティションを他のすべてのマシンからロードする必要があるのは正しいですか? 潜在的に、すべてのマシンが目的の中間キーを持つキーと値のペアを持つことができるため、reduce タスクごとに、他のすべてのマシンにクエリを実行する必要がある可能性があります。それは本当に効率的ですか?
  3. 元の論文によると、パーティションの数 (R) はユーザーによって指定されます。しかし、reduce タスクの入力はパーティションではありませんか? より正確には、すべてのマシン間で同じ番号を持つすべてのパーティションの結合が、1 つのリデュース タスクの入力ではないでしょうか。つまり、R は、ユーザーが通常知らない個別の中間キーの数に依存します。

概念的には、map および reduce 関数/タスクの入力と出力が何であるかは明らかです。しかし、技術的なレベルで MapReduce をまだ理解していないと思います。誰かが私を理解するのを手伝ってくれませんか?

4

2 に答える 2

12
  1. マップ タスクの実行中に (スロースタートと呼ばれる機能を使用して) レデューサー タスクを開始できますが、レデューサーはコピー フェーズしか実行できません (完了したマップ タスクから完了した結果を取得します。最終的な並べ替えと削減を実際に実行する前に、マッパーが完了する必要があります。
  2. reduce タスクは、実際には 0 個、1 個、または複数のキーを処理します (キーごとに個別のタスクではなく)。各レデューサーは、パーティションに関連する各マップ タスクからマップ出力を取得してから、これらの中間出力を並べ替えて、一度に 1 つのキー セットを削減する必要があります。
  3. 2 のメモに戻ります。リデューサー タスク (パーティションごとに 1 つ) は、個別のキーごとに 1 つのタスクではなく、ゼロ、1 つ、または複数のキーで実行されます。

また、中間キーがハッシュされ、モジュロ化されているため (デフォルトの HashPartitioner を使用している場合)、そのキーを処理する縮小パーティションを決定するために、中間キーの広がりとバリエーションを理解することも重要です。偶数のレデューサー タスク (10) があり、常に偶数にハッシュされるキーを出力するとします。この場合、これらのハッシュ数と 10 のモジュロは常に偶数になります。つまり、奇数のレデューサーはデータを処理することはありません。

于 2013-07-19T11:00:33.357 に答える
8

クリスが言ったことへの補足、

基本的に、Hadoop のパーティショナー クラス (例: Default HashPartitioner )

この機能を実装する必要があり、

int getPartition(K key, V value, int numReduceTasks) 

この関数は、パーティション番号を返す役割を担い、HashPartitionerで見られるように、numReduceTasks変数からジョブを開始するときに修正したレデューサーの数を取得します。

上記の関数が返す整数に基づいて、Hadoop は特定のキーの削減タスクを実行するノードを選択します。

お役に立てれば。

于 2013-07-19T11:26:21.453 に答える