GoogleMapReduceの論文によると
リデュースワーカーがすべての中間データを読み取ると、同じキーのすべてのオカレンスがグループ化されるように、中間キーでデータを並べ替えます。
MongoDBドキュメントによると
map / reduceエンジンは、reduce関数を繰り返し呼び出す場合があります。したがって、これらの関数はべき等でなければなりません。
したがって、Googleの論文で定義されているMapReduceの場合、特定のキーのデータがレデューサーに転送されると、reduceはキーと値のペアの処理を開始します。しかし、Tomaszが述べたように、MongoDBはわずかに異なる方法でMapReduceを実装しているようです。
Googleが提案したMapReduceでは、MapタスクまたはReduceタスクのいずれかがKVペアを処理しますが、MongoDB実装では、MapタスクとReduceタスクが同時にKVペアを処理します。ノードが効率的に使用されておらず、クラスター内のMapスロットとReduceスロットがいっぱいで、新しいジョブを実行できない可能性があるため、MongoDBアプローチは効率的ではない可能性があります。
Hadoopの欠点は、マップがデータの処理を完了するまでレデューサータスクがKVペアを処理しないことですが、マッパーが処理を完了する前にレデューサータスクを生成できます。パラメータ「mapreduce.job.reduce.slowstart.completedmaps」は「0.05」に設定されており、説明には「削減がジョブにスケジュールされる前に完了する必要があるジョブ内のマップ数の割合」と記載されています。
ここでは、(同じキーを持つ)すべての値を同じマシンに移動して合計する必要があります。データを関数に移動することは、mapreduceが行うことになっていることとは逆のようです。
また、データの局所性は、reduceタスクではなく、mapタスクで考慮されます。リデュースタスクの場合、データは、集約のために、異なるノード上の異なるマッパーからレデューサーに移動する必要があります。
ちょうど私の2c。