В 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.
Я смущен, почему задача карты нуждается в такой большой памяти. По моему мнению, для моей задачи map/reduce достаточно 1 ГБ памяти. Почему, поскольку я назначаю больше памяти контейнеру, задача использует больше? Это потому, что каждая задача получает больше расколов? Я чувствую, что более эффективно уменьшить размер контейнера немного и создать больше контейнеров, чтобы больше задач выполнялось параллельно. Проблема в том, как я могу убедиться, что каждому контейнеру не будет назначено больше разделов, чем он может обрабатывать?