2010-03-29 20 views

risposta

31

Una differenza chiave è che F-J sembra essere progettato per funzionare su una singola VM Java, mentre M-R è progettato esplicitamente per funzionare su un ampio cluster di macchine. Questi sono scenari molto diversi.

F-J offre funzionalità per suddividere un'attività in diverse sottoattività, in modo ricorsivo; più livelli, possibilità di comunicazione "inter-fork" in questa fase, programmazione molto più tradizionale. Non si estende (almeno sulla carta) oltre una singola macchina. Ottimo per approfittare del tuo otto core.

M-R esegue solo una divisione grande, con le divisioni mappate che non parlano tra loro e quindi riducono tutto insieme. Un singolo livello, nessuna comunicazione inter-split fino a ridurre e scalabile in modo massivo. Ottimo per approfittare della tua quota di cloud.

+8

In particolare, F-J consente ai dipendenti di rubare sottotitoli dalle rispettive code. Questo non è possibile se i thread worker sono su macchine diverse (e quindi non hanno memoria condivisa.) – finnw

+2

Secondo la voce [MapReduce Wikipedia] (http://en.wikipedia.org/wiki/MapReduce), MR non è necessariamente limitato a un singolo livello di compiti biforcati. –

+0

qual è la differenza tra fork/join e mapreduce al di fuori del contesto di Java? – user2001850

10

C'è un intero articolo scientifico sull'argomento, Comparing Fork/Join and MapReduce.

Il documento confronta le prestazioni, la scalabilità e la programmabilità di tre paradigmi paralleli: fork/join, MapReduce e un approccio ibrido.

Quello che trovano è fondamentalmente che Java forcella/unirsi trovi latenza avvio basso e scala bene per i piccoli ingressi (< 5 MB), ma non può elaborare ingressi più grandi a causa delle limitazioni di dimensione della memoria condivisa, singole architetture di nodo. D'altra parte, MapReduce ha una significativa latenza di avvio (decine di secondi), ma si adatta bene a input molto più grandi (> 100 MB) su un cluster di calcolo.

Ma c'è molto di più da leggere lì se sei pronto.