2013-07-03 17 views
11

L'Hadoop suddivide i dati in base al numero di mapper impostati nel programma? Cioè, avendo un set di dati di dimensioni 500 MB, se il numero di mappatori è 200 (supponendo che il cluster Hadoop consenta a 200 mappatori contemporaneamente), ciascun mappatore ha 2.5 MB di dati?Come vengono suddivisi i dati in Hadoop

Inoltre, tutti i mappatori vengono eseguiti contemporaneamente o alcuni di essi potrebbero essere eseguiti in serie?

risposta

0

Ho appena eseguito un programma di MR campione basato sulla domanda e qui è la mia ricerca

ingresso: un file più piccolo che la dimensione del blocco.

Caso 1: numero di mapper = 1 Risultato: 1 attività mappa avviata. Inputsplit La dimensione per ogni mappatore (in questo caso solo una) è uguale alla dimensione del file di input .

Caso 2: numero di mappatori = 5 Risultato: 5 attività mappa avviate. La dimensione della dimensione degli ingressi per ogni mappatore corrisponde a un quinto della dimensione del file di input.

Caso 3: numero di mappatori = 10 Risultato: 10 attività mappa avviate. La dimensione della dimensione degli ingressi per ogni mappatore è pari a un decimo della dimensione del file di input.

Quindi, sulla base sopra, per il file meno di dimensione del blocco,

formato split = totale file di input dimensione/numero di carta compito lanciato.

Nota: tenere presente che no. del compito della mappa viene deciso in base agli split di input.

+0

Inoltre, tutti i mappatori vengono eseguiti contemporaneamente o alcuni di essi potrebbero essere eseguiti in serie? - Se ci sono abbastanza slot della mappa, tutte le attività della mappa verrebbero lanciate insieme. Se si dispone di più attività sulla mappa rispetto agli slot disponibili, le attività extra della mappa attenderanno il completamento dei mapping. –

+0

Nota anche che ho considerato che stai utilizzando vecchie API mappate poiché il mio codice è basato su quello. Ecco la firma di getSplits di FileInputFormat e ha numSplits come parametro. public InputSplit [] getSplits (lavoro JobConf, int numSplits) –

+0

è l'alternativa – Tagar

6

Quando si immettono dati in Hadoop Distributed File System (HDFS), Hadoop suddivide i dati in base alla dimensione del blocco (64 MB predefinito) e distribuisce i blocchi attraverso il cluster. Quindi i tuoi 500 MB saranno suddivisi in 8 blocchi. Non dipende dal numero di mapper, è la proprietà di HDFS.

Ora, quando si esegue un lavoro MapReduce, Hadoop assegna per impostazione predefinita 1 mapper per blocco, quindi se si dispone di 8 blocchi, hadoop eseguirà 8 attività mappa.

Tuttavia, se si specifica esplicitamente il numero di mapper (vale a dire 200), la dimensione dei dati elaborati da ciascuna mappa dipende dalla distribuzione dei blocchi e dal nodo in cui è in esecuzione il mapper. Quanti mappatori effettivamente elaborano i tuoi dati dipende dalla tua divisione di input.

Nel tuo caso, supponendo che 500 MB diviso in 8 blocchi, anche se si specificano 200 mapper, non tutti elaboreranno i dati anche se sono inizializzati.

+0

Grazie. Ma il contatore di lavoro mostra che sono stati lanciati 200 mapper! Vuoi dire che non è reale? –

+1

In questo caso, la maggior parte dei mapper verrà eseguita ma non elaborerà i dati. Penso che lo scoprirete al momento del check-out dei log dei mapper, la maggior parte di essi non avrebbe dati di input/output. Modificherò la mia risposta per riflettere questo. – Chaos

23

È il contrario. Il numero di mappatori viene deciso in base al numero di suddivisioni. In realtà è il lavoro di InputFormat, che stai usando, per creare le divisioni. Non hai idea del numero di mappatori fino a quando non è stato deciso il numero di suddivisioni. Inoltre, non è sempre possibile creare divisioni basate sulla dimensione del blocco HDFS. Dipende totalmente dalla logica all'interno del metodo getSplits() del tuo InputFormat.

Per comprendere meglio questo, si supponga di elaborare i dati memorizzati in MySQL utilizzando MR. Poiché in questo caso non vi è alcun concetto di blocco, la teoria che divide si crea sempre in base al blocco HDFS non riesce. Destra? Che dire quindi della creazione di spaccature?Una possibilità è quella di creare divisioni basate su intervalli di righe nella tabella MySQL (e questo è ciò che fa DBInputFormat, un formato di input per leggere i dati da un database relazionale). Supponiamo di avere 100 righe. Quindi potresti avere 5 split di 20 righe ciascuno.

È solo per gli InputFormats basati su FileInputFormat (un InputFormat per la gestione dei dati memorizzati nei file) che le suddivisioni vengono create in base alla dimensione totale, in byte, dei file di input. Tuttavia, il blocco di FileSystem dei file di input viene considerato come limite superiore per le suddivisioni di input. Se hai un file più piccolo della dimensione del blocco HDFS, avrai solo 1 mapper per quel file. Se si desidera avere un comportamento diverso, è possibile utilizzare mapred.min.split.size. Ma dipende di nuovo esclusivamente da getSplits() del tuo InputFormat.

C'è una differenza fondamentale tra MR split e HDFS block e la gente spesso viene confusa da questo. Un blocco è un dato fisico mentre una divisione è solo un pezzo logico che verrà inviato a un mappatore. Una divisione non contiene i dati di input, è solo un riferimento ai dati. Allora cos'è una scissione? Una divisione ha fondamentalmente 2 elementi: uno length in bytes e un set di storage locations, che sono solo stringhe di nome host.

Tornando alla tua domanda. Hadoop consente molto più di 200 mapper. Detto questo, non ha molto senso avere 200 mapper per soli 500 MB di dati. Ricorda sempre che quando parli di Hadoop, hai a che fare con dati enormi. L'invio di soli 2,5 MB di dati a ciascun mappatore sarebbe eccessivo. E sì, se non ci sono slot liberi per la CPU, alcuni mapper possono essere eseguiti dopo il completamento degli attuali mapper. Ma il framework MR è molto intelligente e fa del suo meglio per evitare questo tipo di situazione. Se la macchina in cui sono presenti i dati da elaborare, non dispone di slot CPU liberi, i dati verranno spostati in un nodo vicino, dove sono disponibili slot liberi e elaborati.

HTH

0

Se 200 mapper sono in esecuzione per 500 MB di dati, allora avete bisogno di controllare per ogni dimensione dei singoli file. Se la dimensione del file è inferiore alla dimensione del blocco (64 mb), eseguirà l'attività mappa per ogni file.

normalmente unire i file più piccoli in file di grandi dimensioni (maggiore di dimensionamento dimensione del blocco)

0

No. Non è.

Il numero di mappatori per un lavoro è definito da Framework.

Dai un'occhiata al collegamento del tutorial Apache MapReduce.

Quante mappe?

Il numero di mappe è solitamente guidato dalla dimensione totale degli ingressi, cioè, il numero totale di blocchi di file di input.

Il livello corretto di parallelismo per le mappe sembra essere di circa 10-100 mappe per nodo, anche se è stato impostato fino a 300 mappe per attività di mappa molto cpu-light. L'installazione delle attività richiede un po ', quindi è meglio se le mappe richiedono almeno un minuto per l'esecuzione.

Pertanto, se si prevedono 10 TB di dati di input e un blocco di 128 MB, si ottengono 82.000 mappe, a meno di Configuration.set (MRJobConfig.NUM_MAPS, int) (che fornisce solo un suggerimento al framework) è usato per impostarlo ancora più in alto.

Tornando alle vostre domande:

Cioè, avere un set di dati di dimensioni 500 MB, se il numero di mapper è di 200 (supponendo che il cluster Hadoop permette 200 mapper contemporaneamente), è ogni mapper dato 2,5 MB di dati?

Se il blocco DFS e le dimensioni di ingresso Split è 128 MB, quindi 500 MB file richiede 4 Mappers per elaborare i dati. Framework eseguirà 4 attività Mapper nel caso precedente.

Tutti i mappatori vengono eseguiti contemporaneamente o alcuni di essi potrebbero essere eseguiti in serie?

Tutti i mappatori funzionano simultaneamente. Ma Reducer funziona solo quando l'output di tutti i Mapper è stato copiato e disponibile per loro.

Problemi correlati