Контейнер для пряжи Hadoop не выделяет достаточно места
Я выполняю задание Hadoop, и в моем файле yarn-site.xml у меня есть следующая конфигурация:
<property>
<name>yarn.scheduler.minimum-allocation-mb</name>
<value>2048</value>
</property>
<property>
<name>yarn.scheduler.maximum-allocation-mb</name>
<value>4096</value>
</property>
Тем не менее, я все еще иногда получаю следующую ошибку:
Container [pid=63375,containerID=container_1388158490598_0001_01_000003] is running beyond physical memory limits. Current usage: 2.0 GB of 2 GB physical memory used; 2.8 GB of 4.2 GB virtual memory used. Killing container.
Я обнаружил, что при увеличении yarn.scheduler.minimum-alloc-mb физическая память, выделенная для контейнера, увеличивается. Однако я не всегда хочу, чтобы для моего контейнера выделялось 4 ГБ, и думал, что, явно указав максимальный размер, я смогу обойти эту проблему. Я понимаю, что Hadoop не может определить, сколько памяти ему нужно выделить для контейнера перед запуском маппера, поэтому как мне выделять больше памяти для контейнера, только если ему нужна эта дополнительная память?
2 ответа
Вы также должны правильно настроить распределение памяти для MapReduce. Из этого урока HortonWorks:
[...]
Для нашего примера кластера у нас есть минимальная оперативная память для контейнера (yarn.scheduler.minimum-allocation-mb) = 2 ГБ. Таким образом, мы назначим 4 ГБ для Контейнеров задач Map и 8 ГБ для Контейнеров уменьшенных задач.
В mapred-site.xml:
mapreduce.map.memory.mb
: 4096
mapreduce.reduce.memory.mb
: 8192Каждый контейнер будет запускать JVM для задач Map и Reduce. Размер кучи JVM должен быть установлен ниже, чем карта и уменьшить память, определенные выше, чтобы они находились в границах памяти контейнера, выделенной YARN.
В mapred-site.xml:
mapreduce.map.java.opts
:-Xmx3072m
mapreduce.reduce.java.opts
:-Xmx6144m
Приведенные выше настройки настраивают верхний предел физической памяти, который будут использовать задачи Map и Reduce.
Наконец, у кого-то из этой цепочки в списке рассылки Hadoop возникла та же проблема, и в их случае оказалось, что в их коде произошла утечка памяти.
Если какая-либо из перечисленных конфигураций не помогла. Если проблема связана с памятью картографа, я хотел бы предложить несколько вещей, которые необходимо проверить.
- Проверьте , включен ли комбайнер или нет? Если да, то это означает, что логика сокращения должна выполняться для всех записей (вывод mapper). Это происходит в памяти. На основе вашего приложения вам нужно проверить, помогает ли включение комбайнера или нет. Компромисс находится между байтами передачи по сети и затраченным временем / памятью / ЦП для логики уменьшения количества записей "X".
- Если вы чувствуете, что объединитель не имеет большой ценности, просто отключите его.
- Если вам нужен объединитель, а 'X' - огромное число (скажем, миллионы записей), тогда подумайте об изменении логики разделения (для форматов ввода по умолчанию используйте меньший размер блока, обычно 1 размер блока = 1 разделение), чтобы отобразить меньшее количество записей в одиночный картограф
- Количество обрабатываемых записей в одном маппере. Помните, что все эти записи должны быть отсортированы в памяти (вывод mapper отсортирован). Попробуйте установить для mapreduce.task.io.sort.mb (по умолчанию 200 МБ) более высокое значение, если это необходимо. mapred-configs.xml
- Если что-то из вышеперечисленного не помогло, попробуйте запустить логику отображения как отдельное приложение и профилировать приложение с помощью Profiler (например, JProfiler) и посмотреть, где используется память. Это может дать вам очень хорошее понимание.