MapReduce プログラミング モデル全般についてはかなり理解していると思いますが、元の論文やその他の情報源を読んでも、特に中間結果の分割に関して、多くの詳細が不明です。
これまでの MapReduce についての私の理解を簡単に要約します。潜在的に非常に大きな入力データ セットがあり、MR-Framework によって M 個の異なる断片に自動的に分割されます。ピースごとに、フレームワークは 1 つのマップ タスクをスケジュールします。このタスクは、クラスター内の使用可能なプロセッサ/マシンの 1 つによって実行されます。M 個のマップ タスクのそれぞれがキーと値のペアのセットを出力します。これは、このマップ タスクを実行したのと同じマシンにローカルに保存されます。各マシンはディスクを R パーティションに分割し、中間キーに基づいて計算された中間キーと値のペアをパーティション間で分散します。次に、フレームワークは、個別の中間キーごとに 1 つの削減タスクを開始します。このタスクは、使用可能なマシンのいずれかによって再度実行されます。
今私の質問は次のとおりです。
- 一部のチュートリアルでは、map タスクと reduce タスクが並行して実行される可能性があるようです。これは正しいですか?それぞれの個別の中間キーに対して、reduce タスクが 1 つだけ開始されると仮定すると、どうしてでしょうか? 最初の reduce タスクを開始する前に、最後の map タスクが完了するまで待つ必要はありませんか?
- 個別の中間キーごとに 1 つの reduce タスクがあるため、各 reduce タスクが実行中のマシンに対応するパーティションを他のすべてのマシンからロードする必要があるのは正しいですか? 潜在的に、すべてのマシンが目的の中間キーを持つキーと値のペアを持つことができるため、reduce タスクごとに、他のすべてのマシンにクエリを実行する必要がある可能性があります。それは本当に効率的ですか?
- 元の論文によると、パーティションの数 (R) はユーザーによって指定されます。しかし、reduce タスクの入力はパーティションではありませんか? より正確には、すべてのマシン間で同じ番号を持つすべてのパーティションの結合が、1 つのリデュース タスクの入力ではないでしょうか。つまり、R は、ユーザーが通常知らない個別の中間キーの数に依存します。
概念的には、map および reduce 関数/タスクの入力と出力が何であるかは明らかです。しかし、技術的なレベルで MapReduce をまだ理解していないと思います。誰かが私を理解するのを手伝ってくれませんか?