Контейнер для пряжи 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) и посмотреть, где используется память. Это может дать вам очень хорошее понимание.
Другие вопросы по тегам