В 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. Почему, когда я выделяю контейнеру больше памяти, задача использует больше? Это потому, что каждая задача получает больше разделений? Я считаю, что более эффективно немного уменьшить размер контейнера и создать больше контейнеров, чтобы больше задач выполнялось параллельно. Проблема в том, как я могу убедиться, что каждому контейнеру не будет назначено больше разделений, чем он может обработать?
Ответы:
Вы также должны правильно настроить максимальное выделение памяти для MapReduce. Из этого руководства HortonWorks :
Подвести итог:
mapreduce
конфиги, а неmapred
те. РЕДАКТИРОВАТЬ: этот комментарий больше не применим теперь, когда вы отредактировали свой вопрос.java.opts
параметров, перечисленных выше.Наконец, вы можете проверить этот другой вопрос SO, который описывает аналогичную проблему (и решение).
источник
mapreduce.map.java.opts
иmapreduce.reduce.java.opts
решив мою проблему. Знаете ли вы, что фактическая память, назначенная задаче, определяется толькоmapreduce.map/reduce.memory.mb
? Какyarn.scheduler.minimum-allocation-mb
влияет на фактическое назначение памяти?На уровне пряжи есть проверка соотношения использования виртуальной и физической памяти. Проблема не только в том, что у виртуальной машины недостаточно физической памяти. Но это потому, что использование виртуальной памяти больше, чем ожидалось для данной физической памяти.
Примечание . Это происходит в Centos / RHEL 6 из-за агрессивного выделения виртуальной памяти.
Его можно решить одним из следующих способов:
Отключите проверку использования виртуальной памяти, установив для yarn.nodemanager.vmem-check-enabled значение false ;
Увеличьте соотношение VM: PM, установив yarn.nodemanager.vmem-pmem-ratio на более высокое значение.
Ссылки :
https://issues.apache.org/jira/browse/HADOOP-11364
http://blog.cloudera.com/blog/2014/04/apache-hadoop-yarn-avoiding-6-time-consuming-gotchas/
Добавьте следующее свойство в yarn-site.xml
источник
У меня была действительно похожая проблема с использованием HIVE в EMR. Ни одно из существующих решений не помогло мне - то есть ни одна из конфигураций mapreduce не работала для меня; и также не установил
yarn.nodemanager.vmem-check-enabled
значение false.Однако в итоге сработала установка
tez.am.resource.memory.mb
, например:Еще один параметр, который следует учитывать при настройке:
yarn.app.mapreduce.am.resource.mb
источник
Не могу комментировать принятый ответ из-за низкой репутации. Однако я хотел бы добавить, что такое поведение задумано. NodeManager убивает ваш контейнер. Похоже, вы пытаетесь использовать потоковую передачу hadoop, которая работает как дочерний процесс задачи уменьшения карты. NodeManager отслеживает все дерево процессов задачи, и если он потребляет больше памяти, чем максимальное значение, установленное в mapreduce.map.memory.mb или mapreduce.reduce.memory.mb соответственно, мы ожидаем, что Nodemanager завершит задачу, иначе ваша задача - украсть память, принадлежащую другим контейнерам, что вам не нужно.
источник
При работе с искрой в EMR у меня была та же проблема, и настройки
maximizeResourceAllocation=true
помогли; надеюсь, это кому-то поможет. Вы должны установить его при создании кластера. Из документов EMR:Где myConfig.json должен сказать:
источник
Мы также недавно столкнулись с этой проблемой. Если проблема связана с памятью картографа, я хотел бы предложить несколько вещей, которые необходимо проверить.
источник
Запуск yarn в подсистеме Windows Linux с ОС Ubunto, ошибка «Выход за пределы виртуальной памяти, Убивающий контейнер». Я решил ее, отключив проверку виртуальной памяти в файле yarn-site.xml.
источник
Я лично не проверял, но ошибки hadoop-yarn-container-virtual-memory-понимание и решение-container-is-running -yond-virtual-memory-limits-errors звучат очень разумно
Я решил проблему,
yarn.nodemanager.vmem-pmem-ratio
установив более высокое значение, и согласен с тем, что:источник