In Hadoop v1 habe ich jedem 7-Mapper- und Reduzierer-Steckplatz eine Größe von 1 GB zugewiesen. Meine Mapper und Reduzierer funktionieren einwandfrei. Mein Computer hat 8G Speicher, 8 Prozessor. Bei YARN wurde beim Ausführen derselben Anwendung auf demselben Computer ein Containerfehler angezeigt. Standardmäßig habe ich folgende Einstellungen:
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>1024</value>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>8192</value>
</property>
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>8192</value>
</property>
Es gab mir Fehler:
Container [pid=28920,containerID=container_1389136889967_0001_01_000121] is running beyond virtual memory limits. Current usage: 1.2 GB of 1 GB physical memory used; 2.2 GB of 2.1 GB virtual memory used. Killing container.
Ich habe dann versucht, das Speicherlimit in mapred-site.xml festzulegen:
<property>
<name>mapreduce.map.memory.mb</name>
<value>4096</value>
</property>
<property>
<name>mapreduce.reduce.memory.mb</name>
<value>4096</value>
</property>
Aber immer noch Fehler:
Container [pid=26783,containerID=container_1389136889967_0009_01_000002] is running beyond physical memory limits. Current usage: 4.2 GB of 4 GB physical memory used; 5.2 GB of 8.4 GB virtual memory used. Killing container.
Ich bin verwirrt, warum die Kartenaufgabe so viel Speicher benötigt. Nach meinem Verständnis reicht 1 GB Speicher für meine Map / Reduce-Aufgabe. Warum verwendet die Aufgabe mehr Speicher, wenn ich dem Container mehr Speicher zuweise? Liegt es daran, dass jede Aufgabe mehr Splits bekommt? Ich halte es für effizienter, die Größe des Containers ein wenig zu verringern und mehr Container zu erstellen, damit mehr Aufgaben parallel ausgeführt werden. Das Problem ist, wie kann ich sicherstellen, dass jedem Container nicht mehr Teilungen zugewiesen werden, als er verarbeiten kann?
Antworten:
Sie sollten auch die maximalen Speicherzuordnungen für MapReduce ordnungsgemäß konfigurieren. Aus diesem HortonWorks-Tutorial :
Etwas zusammenfassen:
mapreduce
Konfigurationen verwenden, nicht diemapred
. BEARBEITEN: Dieser Kommentar gilt nicht mehr, nachdem Sie Ihre Frage bearbeitet haben.java.opts
oben aufgeführten Einstellungen konfiguriert .Schließlich möchten Sie möglicherweise diese andere SO-Frage überprüfen , die ein ähnliches Problem (und eine ähnliche Lösung) beschreibt.
quelle
mapreduce.map.java.opts
undmapreduce.reduce.java.opts
löse. Wissen Sie, ob der der Aufgabe tatsächlich zugewiesene Speicher nur durch definiert istmapreduce.map/reduce.memory.mb
? Wie wirkt sich dasyarn.scheduler.minimum-allocation-mb
auf die tatsächliche Speicherzuordnung aus?Auf Garnebene wird die Nutzungsrate des virtuellen und physischen Speichers überprüft. Das Problem ist nicht nur, dass die VM nicht über genügend physischen Speicher verfügt. Dies liegt jedoch daran, dass die Nutzung des virtuellen Speichers für einen bestimmten physischen Speicher höher ist als erwartet.
Hinweis : Dies geschieht unter Centos / RHEL 6 aufgrund der aggressiven Zuweisung von virtuellem Speicher.
Es kann entweder gelöst werden durch:
Deaktivieren Sie die Überprüfung der Nutzung des virtuellen Speichers, indem Sie yarn.nodemanager.vmem-check-enabled auf false setzen .
Erhöhen Sie das VM: PM-Verhältnis, indem Sie das Verhältnis yarn.nodemanager.vmem-pmem auf einen höheren Wert einstellen .
Referenzen :
https://issues.apache.org/jira/browse/HADOOP-11364
http://blog.cloudera.com/blog/2014/04/apache-hadoop-yarn-avoiding-6-time-consuming-gotchas/
Fügen Sie die folgende Eigenschaft in yarn-site.xml hinzu
quelle
Ich hatte ein wirklich ähnliches Problem mit HIVE in der EMR. Keine der vorhandenen Lösungen funktionierte für mich - dh keine der Mapreduce-Konfigurationen funktionierte für mich; und auch nicht
yarn.nodemanager.vmem-check-enabled
auf falsch gesetzt.Am Ende funktionierte jedoch Folgendes
tez.am.resource.memory.mb
:Eine weitere Einstellung, die Sie in Betracht ziehen sollten, ist
yarn.app.mapreduce.am.resource.mb
quelle
Ich kann die akzeptierte Antwort aufgrund des schlechten Rufs nicht kommentieren. Ich möchte jedoch hinzufügen, dass dieses Verhalten beabsichtigt ist. Der NodeManager tötet Ihren Container. Es hört sich so an, als würden Sie versuchen, Hadoop-Streaming zu verwenden, das als untergeordneter Prozess der Map-Reduce-Aufgabe ausgeführt wird. Der NodeManager überwacht den gesamten Prozessbaum der Aufgabe. Wenn er mehr Speicher als das in mapreduce.map.memory.mb bzw. mapreduce.reduce.memory.mb festgelegte Maximum verbraucht, wird der Nodemanager die Aufgabe ansonsten beenden Ihre Aufgabe ist es, Speicher zu stehlen, der zu anderen Containern gehört, die Sie nicht wollen.
quelle
Während ich mit Spark in EMR arbeitete, hatte ich das gleiche Problem und die Einstellung
maximizeResourceAllocation=true
hat den Trick gemacht. hoffe es hilft jemandem. Sie müssen es festlegen, wenn Sie den Cluster erstellen. Aus den EMR-Dokumenten:Wo myConfig.json sagen sollte:
quelle
Wir haben uns kürzlich auch mit diesem Problem befasst. Wenn das Problem mit dem Mapper-Speicher zusammenhängt, möchte ich einige Dinge vorschlagen, die überprüft werden müssen.
quelle
Ausführen von Garn auf einem Windows Linux-Subsystem mit Ubunto-Betriebssystem, Fehler "Laufen über die Grenzen des virtuellen Speichers hinaus, Container töten" Ich habe das Problem behoben, indem ich die Prüfung des virtuellen Speichers in der Datei yarn-site.xml deaktiviert habe
quelle