Quanti riduce? (Da official documentation)
Il giusto numero di riduce sembra essere 0,95 o 1,75 moltiplicato per (n. Di nodi) * (n. Di contenitori massimo per nodo).
Con 0,95 tutte le riduzioni possono essere lanciate immediatamente e iniziare il trasferimento delle uscite della mappa quando le mappe finiscono.con 1.75 i nodi più veloci finiranno il loro primo round di riduzioni e lanciano una seconda ondata di riduzioni facendo un lavoro molto migliore di bilanciamento del carico
L'aumento del numero di riduzioni aumenta l'overhead del framework, ma aumenta il bilanciamento del carico e riduce il costo dei guasti.
I fattori di ridimensionamento di cui sopra sono leggermente inferiori rispetto ai numeri interi per riservare alcuni slot di riduzione nel framework per attività speculative e attività non riuscite.
Questo articolo riguarda anche il conteggio di Mapper.
Quante mappe?
Il numero di mappe è solitamente guidato dalla dimensione totale degli ingressi, cioè, il numero totale di blocchi di file di input.
Il giusto livello di parallelismo per le mappe sembra essere intorno a 10-100 mappe per-nodo, anche se è stato impostato fino a 300 mappe per compiti mappa molto cpu-luce. L'installazione delle attività richiede un po ', quindi è meglio se le mappe richiedono almeno un minuto per l'esecuzione.
Così, se aspettare 10 TB di dati in ingresso e hanno un blocksize di 128 MB, si ritroverà con 82.000 mappe, a meno che Configuration.set(MRJobConfig.NUM_MAPS, int)
(che prevede solo un accenno al quadro) è usato per impostarlo anche più alto.
Se si desidera modificare il valore predefinito di 1 per numero di riduttori, è possibile impostare sotto proprietà (dalla versione 2.x Hadoop) come parametro di riga di comando
mapreduce.job.riduce
O
è possibile impostare a livello di codice con
job.setNumReduceTasks(integer_numer);
Dai un'occhiata alla un'altra connessa interrogazione SE: What is Ideal number of reducers on Hadoop?
Il numero dei riduttori è 1 per impostazione predefinita, a meno che non lo si imposta a qualsiasi numero personalizzato che ha senso per la tua applicazione, usando 'job.setNumReduceTasks (n);'. Suggerirei di saltare le "regole generali" che esistono. – vefthym
@vefthym è ancora vero? Ho dimenticato di specificare un numero qualsiasi e di avere 56 GB di dati, ed è stato diviso in 7 file da 8 GB ciascuno. C'è un fallback automatico se ci sono troppi dati per 1 riduttore? – Thomas
@Thomas ti stai riferendo al numero di file di output o al numero di split di input? Il valore predefinito di 1 è per i file di output (ridurre le attività). Credo che sia ancora vero. Se non lo avevi programmato, avresti potuto anche impostarlo come parametro di runtime. – vefthym