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