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?