2014-06-05 4 views

Antwort

48

mapreduce.map.memory.mb ist die obere Speichergrenze, die Hadoop einem Mapper in Megabyte zugewiesen werden kann. Der Standardwert ist 512. Wird diese Grenze überschritten, Hadoop wird die Mapper mit einem Fehler wie diese töten:

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 ist ein Java-Prozess und jeder Java-Prozess hat seinen eigenen Heap-Speicher maximale Belegung Einstellungen konfiguriert über mapred.map.child.java.opts (oder mapreduce.map.java.opts in Hadoop 2+). Wenn der Abbildungsprozess aus Heap-Speicher ausgeführt wird, wirft der Mapper ein Java aus Speicher Ausnahmen:

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

So die Hadoop und die Java-Einstellungen verwendet sind. Die Hadoop-Einstellung ist eher eine Ressourcenerzwingung/-steuerung und die Java-Konfiguration eher eine Ressourcenkonfiguration.

Die Einstellungen für den Java-Heapspeicher sollten kleiner als der Hadoop-Containerspeicher sein, da wir Reservespeicher für Java-Code benötigen. Normalerweise wird empfohlen, 20% Speicher für Code zu reservieren. Wenn also die Einstellungen korrekt sind, sollten Java-basierte Hadoop-Aufgaben niemals von Hadoop erledigt werden. Daher sollte der Fehler "Killing-Container" nie wie oben angezeigt werden.

Wenn bei Ihnen Java-Speicherfehler auftreten, müssen Sie beide Speichereinstellungen erhöhen.

+0

Das ist, was ich suche, danke bro. – Judking

+0

Eine andere Frage bitte, ist 'mapreduce.map.memory.mb' genau die Menge der Ressource, die der Container, der die Mapper-Task verwendet, verwendet? – wuchang

42

Mit den folgenden Eigenschaften können Sie Optionen angeben, die an die JVMs übergeben werden, auf denen Ihre Aufgaben ausgeführt werden. Diese können verwendet werden mit -Xmx zur Kontrolle Heap verfügbar.

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 

Hinweis: Es gibt kein direktes Hadoop 2-Äquivalent für den ersten; Der Ratschlag im Quellcode besteht darin, die anderen beiden zu verwenden. mapred.child.java.opts wird weiterhin unterstützt (wird jedoch von den anderen beiden spezifischeren Einstellungen überschrieben, falls vorhanden).

auf diese Komplementäre, die folgenden können Sie für Ihre Aufgaben Gesamtspeicher (möglicherweise virtuelle) verfügbar begrenzen - einschließlich Heap, Stack und Klassendefinitionen:

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 

Ich schlage vor Einstellung -Xmx-75% der memory.mb Werte.

In einem YARN-Cluster dürfen Jobs nicht mehr Speicher belegen als die serverseitige Konfiguration yarn.scheduler.maximum-allocation-mb oder sie werden gelöscht.

Um die Standardwerte und ihre Priorität zu überprüfen, finden Sie unter JobConf und MRJobConfig im Hadoop-Quellcode.

Fehlerbehebung

Denken Sie daran, dass Ihr mapred-site.xml Standardwerte für diese Einstellungen zur Verfügung stellen kann. Dies kann verwirrend sein - z.B. Wenn Ihr Job programmgesteuert mapred.child.java.opts einstellt, hat dies keine Auswirkung, wenn mapred-site.xml mapreduce.map.java.opts oder mapreduce.reduce.java.opts setzt. Sie müssten diese Eigenschaften stattdessen in Ihrem Job festlegen, um die mapred-site.xml zu überschreiben. Überprüfen Sie die Konfigurationsseite Ihres Jobs (suchen Sie nach 'xmx'), um zu sehen, welche Werte angewendet wurden und woher sie kommen.

ApplicationMaster Speicher

In einem GARN Cluster können Sie die folgenden zwei Eigenschaften verwenden, um die Größe des verfügbaren Speichers auf Ihre ApplicationMaster zu steuern (zu halten Details der Eingabesplits, Status von Aufgaben, etc.):

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

Auch hier könnte man -Xmx (im ehemaligen) auf 75% des resource.mb Wert gesetzt.

Andere Konfigurationen

Es gibt viele andere Konfigurationen Speichergrenzen beziehen, von denen einige als veraltet - siehe JobConf Klasse. Ein nützlicher:

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

Setzen Sie diese auf einen niedrigen Wert (10) Shuffle zu zwingen, auf der Festplatte im Fall passieren, dass Sie ein OutOfMemoryError bei MapOutputCopier.shuffleInMemory getroffen.

+0

Eine andere Frage bitte, ist 'mapreduce.map.memory.mb' genau die Menge der Ressource, die der Container, der die Mapper-Task verwendet, verwendet? – wuchang

Verwandte Themen