MapReduceプログラミングモデル全般については十分理解していると思いますが、元の論文やその他の情報源を読んだ後でも、特に中間結果の分割に関して、多くの詳細が不明確です。
これまでのMapReduceの理解を簡単にまとめます。潜在的に非常に大きな入力データセットがあり、MRフレームワークによってM個の異なる部分に自動的に分割されます。各部分について、フレームワークは1つのマップタスクをスケジュールします。このタスクは、クラスター内の使用可能なプロセッサ/マシンの1つによって実行されます。 M個のマップタスクはそれぞれ、キーと値のペアのセットを出力します。これは、このマップタスクを実行したマシンと同じマシンにローカルに保存されます。各マシンは、ディスクをRパーティションに分割し、中間キーに基づいて計算された中間キー値のペアをパーティション間で分散します。次に、フレームワークは、個別の中間キーごとに1つのreduceタスクを開始します。これは、使用可能なマシンのいずれかによって再び実行されます。
今私の質問は:
概念的には、マップの入力と出力、および関数/タスクの削減が明確です。しかし、技術的なレベルでMapReduceをまだ理解していないと思います。誰かが私を理解するのを手伝ってくれませんか?
中間キーがハッシュされて(デフォルトのHashPartitionerを使用している場合)モジュロ化されるため、中間キーの分散とバリエーションを理解し、どのキーパーティションがそのキーを処理するかを決定することも重要です。偶数のレデューサータスク(10)があり、常に偶数にハッシュされる出力キーがあるとします。この場合、これらのハッシュ数と10のモジュロは常に偶数になります。つまり、奇数のレデューサーはデータを処理しないでください。
クリスの発言の補遺、
基本的に、Hadoopのパーティショナークラス(例:デフォルト HashPartitioner )
この関数を実装する必要があります、
int getPartition(K key, V value, int numReduceTasks)
この関数はパーティション番号を返す役割を果たし、numReduceTasks変数からジョブを開始するときに修正したレデューサーの数を取得します。 HashPartitioner。
上記の関数が返す整数に基づいて、Hadoopは特定のキーのリデュースタスクを実行するノードを選択します。
お役に立てれば。