2014-06-05 16 views

risposta

48

mapreduce.map.memory.mb è il limite di memoria superiore che Hadoop consente di assegnare a un programma di mappatura, in megabyte. Il valore predefinito è 512. Se questo limite viene superato, Hadoop ucciderà il mapper con un errore come questo:

Container[pid=container_1406552545451_0009_01_000002,containerID=container_234132_0001_01_000001] is running beyond physical memory limits. Current usage: 569.1 MB of 512 MB physical memory used; 970.1 MB of 1.0 GB virtual memory used. Killing container.

Hadoop mapper è un processo Java e ogni processo Java ha le sue impostazioni di massima di allocazione propria memoria heap configurate tramite mapred.map.child.java.opts (o mapreduce.map.java.opts in Hadoop 2+). Se il processo mapper esaurisce la memoria heap, il mapper getta un java di eccezioni di memoria:

Error: java.lang.RuntimeException: java.lang.OutOfMemoryError

Così, il Hadoop e il Java impostazioni sono correlate. L'impostazione Hadoop è più di un'applicazione per l'applicazione delle risorse/controllo e Java è più una configurazione di risorse.

Le impostazioni dell'heap Java devono essere inferiori al limite di memoria del contenitore Hadoop poiché è necessario disporre della memoria di riserva per il codice Java. Di solito, si consiglia di riservare il 20% di memoria per il codice. Quindi, se le impostazioni sono corrette, le attività Hadoop basate su Java non dovrebbero mai essere uccise da Hadoop, quindi non si dovrebbe mai vedere l'errore "Killing container" come sopra.

Se si verificano errori di memoria di Java, è necessario aumentare entrambe le impostazioni di memoria.

+0

Questo è quello che sto cercando, grazie fratello. – Judking

+0

Un'altra domanda, per favore, è 'mapreduce.map.memory.mb' esattamente la quantità di risorsa utilizzata dal contenitore che esegue l'attività del mappatore? – wuchang

42

Le seguenti proprietà consentono di specificare le opzioni da passare alle JVM che eseguono le attività. Questi possono essere utilizzati con -Xmx per controllare l'heap disponibile.

Hadoop 0.x, 1.x (deprecated)  Hadoop 2.x 
------------------------------- -------------------------- 
mapred.child.java.opts    
mapred.map.child.java.opts   mapreduce.map.java.opts 
mapred.reduce.child.java.opts  mapreduce.reduce.java.opts 

Nota per il primo di questi non esiste un equivalente Hadoop 2; il consiglio nel codice sorgente è di usare gli altri due. mapred.child.java.opts è ancora supportato (ma è sovrascritto dalle altre due impostazioni più specifiche se presenti).

Complementare a questi, i seguenti consentono di limitare memoria (possibilmente virtuale) disponibile per le attività totale - tra cui heap, stack e definizioni di classe:

Hadoop 0.x, 1.x (deprecated)  Hadoop 2.x 
------------------------------- -------------------------- 
mapred.job.map.memory.mb   mapreduce.map.memory.mb 
mapred.job.reduce.memory.mb  mapreduce.reduce.memory.mb 

mi suggeriscono di impostare -Xmx al 75% del Valori memory.mb.

In un cluster YARN, i lavori non devono utilizzare più memoria della configurazione lato server yarn.scheduler.maximum-allocation-mb oppure verranno eliminati.

Per controllare i valori predefiniti e la precedenza di questi, vedere JobConf e MRJobConfig nel codice sorgente Hadoop.

Risoluzione dei problemi

Ricordate che il vostro mapred-site.xml può fornire valori predefiniti per queste impostazioni. Questo può essere fonte di confusione, ad es. se il lavoro imposta mapred.child.java.opts in modo programmatico, ciò non avrebbe alcun effetto se mapred-site.xml imposta mapreduce.map.java.opts o mapreduce.reduce.java.opts. Dovresti invece impostare queste proprietà nel tuo lavoro, per sovrascrivere mapred-site.xml. Controlla la pagina di configurazione del tuo lavoro (cerca 'xmx') per vedere quali valori sono stati applicati e da dove provengono.

ApplicationMaster memoria

In un cluster FILATO, è possibile utilizzare le seguenti due proprietà per controllare la quantità di memoria disponibile per il vostro ApplicationMaster (per contenere i dettagli di divide in ingresso, stato delle attività, ecc):

Hadoop 0.x, 1.x     Hadoop 2.x 
------------------------------- -------------------------- 
            yarn.app.mapreduce.am.command-opts 
            yarn.app.mapreduce.am.resource.mb 

Anche in questo caso, è possibile impostare -Xmx (nella ex) al 75% del valore resource.mb.

Altre configurazioni

Ci sono molte altre configurazioni relative ai limiti di memoria, alcuni di loro deprecato - vedere la classe JobConf. Un utile uno:

Hadoop 0.x, 1.x (deprecated)  Hadoop 2.x 
------------------------------- -------------------------- 
mapred.job.reduce.total.mem.bytes mapreduce.reduce.memory.totalbytes 

Impostare su un valore basso (10) per forzare casuale che accada su disco nel caso in cui si colpisce un OutOfMemoryError a MapOutputCopier.shuffleInMemory.

+0

Un'altra domanda, per favore, è 'mapreduce.map.memory.mb' esattamente la quantità di risorsa utilizzata dal contenitore che esegue l'attività del mappatore? – wuchang