У Hadoop v1 я призначив кожному 7 слотам картографа та редуктора розміром 1 ГБ, мої картографа та редуктори працюють нормально. Мій апарат має пам’ять 8G, 8 процесорів. Тепер з YARN, під час запуску того самого додатка на тій самій машині, я отримав помилку контейнера. За замовчуванням у мене є такі налаштування:
<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>
Це дало мені помилку:
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.
Потім я спробував встановити обмеження пам’яті в mapred-site.xml:
<property>
<name>mapreduce.map.memory.mb</name>
<value>4096</value>
</property>
<property>
<name>mapreduce.reduce.memory.mb</name>
<value>4096</value>
</property>
Але все одно з'являється помилка:
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.
Мене бентежить, чому завдання на карту потребує стільки пам'яті. На моєму розумінні, 1 Гб пам’яті достатньо для мого завдання на карту / зменшення. Чому, коли я призначаю більше пам'яті контейнеру, завдання використовує більше? Це тому, що кожне завдання отримує більше розколів? Я вважаю, що ефективніше трохи зменшити розмір контейнера і створити більше контейнерів, щоб паралельно виконувалось більше завдань. Проблема полягає в тому, як я можу переконатися, що кожному контейнеру не буде призначено більше розділень, ніж він може обробити?