Impostazione del numero di attività della mappa e riduzione delle attività

Attualmente sto conducendo un lavoro, ho fissato il numero di attività della mappa su 20 ma ottenendo un numero più alto. Ho anche impostato il compito di ridurre a zero, ma sto ancora ottenendo un numero diverso da zero. Anche il tempo totale per il completamento del lavoro MapReduce non viene visualizzato. Qualcuno può dirmi cosa sto facendo male. Sto usando questo comando

hadoop jar Test_Parallel_for.jar Test_Parallel_for Matrix/test4.txt Result 3 \ -D mapred.map.tasks = 20 \ -D mapred.reduce.tasks =0 

Produzione:

 11/07/30 19:48:56 INFO mapred.JobClient: Job complete: job_201107291018_0164 11/07/30 19:48:56 INFO mapred.JobClient: Counters: 18 11/07/30 19:48:56 INFO mapred.JobClient: Job Counters 11/07/30 19:48:56 INFO mapred.JobClient: Launched reduce tasks=13 11/07/30 19:48:56 INFO mapred.JobClient: Rack-local map tasks=12 11/07/30 19:48:56 INFO mapred.JobClient: Launched map tasks=24 11/07/30 19:48:56 INFO mapred.JobClient: Data-local map tasks=12 11/07/30 19:48:56 INFO mapred.JobClient: FileSystemCounters 11/07/30 19:48:56 INFO mapred.JobClient: FILE_BYTES_READ=4020792636 11/07/30 19:48:56 INFO mapred.JobClient: HDFS_BYTES_READ=1556534680 11/07/30 19:48:56 INFO mapred.JobClient: FILE_BYTES_WRITTEN=6026699058 11/07/30 19:48:56 INFO mapred.JobClient: HDFS_BYTES_WRITTEN=1928893942 11/07/30 19:48:56 INFO mapred.JobClient: Map-Reduce Framework 11/07/30 19:48:56 INFO mapred.JobClient: Reduce input groups=40000000 11/07/30 19:48:56 INFO mapred.JobClient: Combine output records=0 11/07/30 19:48:56 INFO mapred.JobClient: Map input records=40000000 11/07/30 19:48:56 INFO mapred.JobClient: Reduce shuffle bytes=1974162269 11/07/30 19:48:56 INFO mapred.JobClient: Reduce output records=40000000 11/07/30 19:48:56 INFO mapred.JobClient: Spilled Records=120000000 11/07/30 19:48:56 INFO mapred.JobClient: Map output bytes=1928893942 11/07/30 19:48:56 INFO mapred.JobClient: Combine input records=0 11/07/30 19:48:56 INFO mapred.JobClient: Map output records=40000000 11/07/30 19:48:56 INFO mapred.JobClient: Reduce input records=40000000 [hcrc1425n30]s0907855: 

Il numero di attività della mappa per un determinato lavoro è determinato dal numero di divisioni di input e non dal parametro mapred.map.tasks. Per ogni suddivisione di input viene generata una mappa. Quindi, nel corso della durata di un lavoro di ridimensionamento della mappa, il numero di attività della mappa è uguale al numero di divisioni di input. mapred.map.tasks è solo un suggerimento per InputFormat per il numero di mappe.

Nel tuo esempio, Hadoop ha determinato che ci sono 24 divisioni di input e genererà in totale 24 attività mappa. Tuttavia, è ansible controllare il numero di attività della mappa che possono essere eseguite in parallelo da ciascuno dei task tracker.

Inoltre, rimuovere uno spazio dopo -D potrebbe risolvere il problema per la riduzione.

Per ulteriori informazioni sul numero di mappe e ridurre le attività, consultare l’url riportato di seguito

http://wiki.apache.org/hadoop/HowManyMapsAndReduces

Come menzionato in precedenza da Praveen, quando si utilizzano le classi FileInputFormat base è solo il numero di divisioni di input che costituiscono i dati. Il numero di riduttori è controllato da mapred.reduce.tasks specificato nel modo in cui lo hai: -D mapred.reduce.tasks=10 specifica 10 riduttori. Si noti che è necessario lo spazio dopo -D ; se si omette lo spazio, la proprietà di configurazione viene passata alla JVM pertinente, non a Hadoop.

Stai specificando 0 perché non c’è lavoro da ridurre? In tal caso, se hai problemi con il parametro run-time, puoi anche impostare il valore direttamente nel codice. Dato un job istanza JobConf , chiamare

 job.setNumReduceTasks(0); 

all’interno, diciamo, la tua implementazione di Tool.run . Questo dovrebbe produrre output direttamente dai mappatori. Se il tuo lavoro in realtà non produce alcun output (perché stai usando il framework solo per effetti collaterali come le chiamate di rete o l’elaborazione delle immagini, o se i risultati sono interamente contabilizzati in Valori contatore), puoi disabilitare l’output anche chiamando

 job.setOutputFormat(NullOutputFormat.class); 

È importante tenere presente che il framework MapReduce in Hadoop ci consente solo di farlo

suggerire il numero di attività della mappa per un lavoro

che come Praveen ha indicato sopra corrisponderà al numero di split di input per l’attività. A differenza del suo comportamento per il numero di riduttori (che è direttamente correlato al numero di file prodotti dal lavoro MapReduce) dove possiamo

chiedono che fornisca n riduttori.

Per spiegarlo con un esempio:

Si supponga che le dimensioni del file di input di hadoop siano 2 GB e si impostino le dimensioni dei blocchi come 64 MB, quindi le attività di 32 Mapper vengono impostate per l’esecuzione mentre ciascun elaboratore elaborerà un blocco di 64 MB per completare il Job Mapper del lavoro Hadoop.

==> Il numero di mapper impostati per l’esecuzione dipendono completamente da 1) Dimensione del file e 2) Dimensione del blocco

Supponi di avere eseguito hadoop su una dimensione di cluster di 4: supponi di aver impostato i parametri mapred.map.tasks e mapred.reduce.tasks nel tuo file conf nei nodes come segue:

 Node 1: mapred.map.tasks = 4 and mapred.reduce.tasks = 4 Node 2: mapred.map.tasks = 2 and mapred.reduce.tasks = 2 Node 3: mapred.map.tasks = 4 and mapred.reduce.tasks = 4 Node 4: mapred.map.tasks = 1 and mapred.reduce.tasks = 1 

Supponiamo di aver impostato i parametri sopra per 4 dei tuoi nodes in questo cluster. Se si nota che il Nodo 2 ha impostato solo 2 e 2 rispettivamente perché le risorse di elaborazione del Nodo 2 potrebbero essere meno es. (2 Processori, 2 Core) e il Nodo 4 è impostato anche più in basso rispettivamente a 1 e 1 potrebbe essere dovuto alle risorse di elaborazione su quel nodo è 1 processore, 2 core quindi non può eseguire più di 1 attività di mapping e 1 riduttore.

Quindi, quando si esegue il lavoro, il nodo 1, il nodo 2, il nodo 3, il nodo 4 sono configurati per eseguire un valore max. totale di (4 + 2 + 4 + 1) 11 compiti del mappatore contemporaneamente su 42 attività del mappatore che devono essere completate dal lavoro. Dopo che ciascun nodo ha completato le attività della mappa, le rimanenti attività del mapper rimangono in 42 attività del programma di analisi.

Ora stiamo arrivando ai riduttori, impostando mapred.reduce.tasks = 0 in modo da ottenere solo l’output del mapper in 42 file (1 file per ogni task del mappatore) e nessun output del riduttore.

Nella versione più recente di Hadoop, ci sono molti più granulari mapreduce.job.running.map.limit e mapreduce.job.running.reduce.limit che ti permettono di impostare il conteggio del riduttore e del mappatore indipendentemente dalla dimensione dello split del file hdfs. Questo è utile se si è sotto vincolo di non occupare grandi risorse nel cluster.

JIRA

Dal tuo log ho capito che hai 12 file di input perché ci sono 12 mappe locali generate. Rack Le mappe locali vengono generate per lo stesso file se alcuni dei blocchi di quel file si trovano in qualche altro nodo di dati. Quanti nodes dati hai?

Nel tuo esempio, le parti -D non vengono prelevate:

 hadoop jar Test_Parallel_for.jar Test_Parallel_for Matrix/test4.txt Result 3 \ -D mapred.map.tasks = 20 \ -D mapred.reduce.tasks =0 

Dovrebbero venire dopo la parte classname come questa:

 hadoop jar Test_Parallel_for.jar Test_Parallel_for -Dmapred.map.tasks=20 -Dmapred.reduce.tasks=0 Matrix/test4.txt Result 3 

Tuttavia, è consentito uno spazio dopo -D .

Si noti inoltre che la modifica del numero di mappatori è probabilmente una ctriggers idea, come altre persone hanno menzionato qui.

Il numero di attività della mappa è definito direttamente dal numero di chunk che il tuo input è diviso. La dimensione del blocco dati (ad es. La dimensione del blocco HDFS) è controllabile e può essere impostata per un singolo file, un insieme di file, una directory (-s). Pertanto, è ansible impostare un numero specifico di attività della mappa in un lavoro, ma comporta l’impostazione di una dimensione di blocco HDFS corrispondente per i dati di input del lavoro. mapred.map.tasks può essere usato anche per questo ma solo se il suo valore fornito è maggiore del numero di divisioni per i dati di input del lavoro.

Il controllo del numero di riduttori tramite mapred.reduce.tasks è corretto. Tuttavia, impostarlo su zero è un caso piuttosto speciale: l’output del lavoro è una concatenazione degli output dei mapping (non ordinati). Nella risposta di Matt si possono vedere più modi per impostare il numero di riduttori.

Un modo per aumentare il numero di mapper è dare il tuo input sotto forma di file divisi [puoi usare il comando linux split]. Lo streaming Hadoop di solito assegna a molti mapper quanti sono i file di input [se esiste un numero elevato di file] se non tenta di suddividere l’input in parti di dimensioni uguali.

  • Usa -D proprietà = valore piuttosto che -D proprietà = valore (elimina spazi bianchi extra). Pertanto, -D mapred.reduce.tasks = value funzionerebbe correttamente.

  • L’impostazione del numero di attività della mappa non riflette sempre il valore impostato poiché dipende dalla dimensione divisa e dal formato di input utilizzato.

  • L’impostazione del numero di riduzioni sostituirà definitivamente il numero di riduzioni impostato sulla configurazione cluster / lato client.

Sono d’accordo sul fatto che il compito di mapping dei numeri dipende dalla divisione dell’input, ma in alcuni degli scenari ho potuto vederne la differenza

case-1 Ho creato un compito di mapping semplice ma crea 2 comandi di file duplicati (dati ia uguali) che ho dato sotto

bin / hadoop jar contrib / streaming / hadoop-streaming-1.2.1.jar -D mapred.reduce.tasks = 0 -input /home/sample.csv -output /home/sample_csv112.txt -mapper / home / amitav / workpython /readcsv.py

Caso-2 Quindi ho rinviato l’attività di mapping a 1 l’uscita in uscita è avvenuta correttamente con un file di output, ma un riduttore ha anche pranzato nella schermata dell’interfaccia utente anche se ho limitato il lavoro di riduzione. Il comando è indicato di seguito.

bin / hadoop jar contrib / streaming / hadoop-streaming-1.2.1.jar -D mapred.map.tasks = 1 mapred.reduce.tasks = 0 -input /home/sample.csv -output /home/sample_csv115.txt – mapper /home/amitav/workpython/readcsv.py

Alla prima parte è già stata data una risposta, “solo un suggerimento” La seconda parte è stata anche risolta, “rimuovi spazi extra intorno =” Se entrambi non funzionano, sei sicuro di aver implementato ToolRunner ?

Il numero di attività della mappa dipende dalla dimensione del file, Se si desidera n numero di mappa, dividere la dimensione del file per n come segue:

 conf.set("mapred.max.split.size", "41943040"); // maximum split file size in bytes conf.set("mapred.min.split.size", "20971520"); // minimum split file size in bytes 

Gente da questa teoria sembra che non possiamo eseguire la mappa ridurre i lavori in parallelo.

Diciamo che ho configurato un totale di 5 job mapper da eseguire su un particolare nodo. Inoltre, voglio usare questo in modo che JOB1 possa usare 3 mapper e JOB2 possa usare 2 mapper in modo che il lavoro possa essere eseguito in parallelo. Ma sopra le proprietà vengono ignorate, quindi come possono eseguire lavori in parallelo.

Da quello che capisco leggendo sopra, dipende dai file di input. Se i file di input sono 100 significa – Hadoop creerà 100 attività mappa. Tuttavia, dipende dalla configurazione del nodo su Quanti possono essere eseguiti in un punto del tempo. Se un nodo è configurato per eseguire 10 attività mappa, solo 10 attività mappa verranno eseguite in parallelo selezionando 10 diversi file di input tra i 100 disponibili. Le attività sulla mappa continueranno a recuperare più file man mano che completano l’elaborazione di un file.