Я хотел бы знать соотношение между параметрами mapreduce.map.memory.mb
и mapred.map.child.java.opts
.
Является mapreduce.map.memory.mb
> mapred.map.child.java.opts
?
Спасибо, Kewal.
Я хотел бы знать соотношение между параметрами mapreduce.map.memory.mb
и mapred.map.child.java.opts
.
Является mapreduce.map.memory.mb
> mapred.map.child.java.opts
?
Спасибо, Kewal.
mapreduce.map.memory.mb - это верхний предел памяти, который Hadoop позволяет назначить сопоставлению в мегабайтах. Значение по умолчанию - 512. Если этот предел превышен, Hadoop убьет картографа с такой ошибкой:
Контейнер [PID = container_1406552545451_0009_01_000002, containerID = container_234132_0001_01_000001] выходит за пределы физической памяти. Текущее использование: 569,1 МБ 512 МБ физической памяти; Используется 970,1 МБ виртуальной памяти 1,0 ГБ. Убивающий контейнер.
Hadoop mapper - это Java-процесс, и каждый Java-процесс имеет свои максимальные настройки распределения памяти кучи, настроенные с помощью mapred.map.child.java.opts (или mapreduce.map.java.opts в Hadoop 2+). Если процесс отображения происходит из памяти кучи, картограф выдает исключение из памяти из памяти:
Ошибка: java.lang.RuntimeException: java.lang.OutOfMemoryError
Таким образом, настройки Hadoop и Java связаны. Настройка Hadoop является скорее элементом управления ресурсами/контролем, а Java - скорее конфигурацией ресурсов.
Настройки кучи Java должны быть меньше предела памяти контейнера Hadoop, поскольку нам нужна резервная память для Java-кода. Как правило, рекомендуется резервировать 20% памяти для кода. Поэтому, если настройки правильные, Java-решения Hadoop никогда не должны быть убиты Hadoop, поэтому вы никогда не увидите ошибку "Killing container", как указано выше.
Если у вас возникли проблемы с ошибками Java из памяти, вам необходимо увеличить оба параметра памяти.
Следующие свойства позволяют указать параметры, которые должны быть переданы JVM, выполняющим ваши задачи. Они могут использоваться с -Xmx
для управления доступной кучей.
Hadoop 0.x, 1.x (deprecated) Hadoop 2.x
------------------------------- --------------------------
mapred.child.java.opts
mapred.map.child.java.opts mapreduce.map.java.opts
mapred.reduce.child.java.opts mapreduce.reduce.java.opts
Обратите внимание, что для первого из них нет прямого эквивалента Hadoop 2; совет в исходном коде должен использовать два других. mapred.child.java.opts
по-прежнему поддерживается (но переопределяется двумя другими более конкретными настройками, если они есть).
В дополнение к этим, вы можете ограничить общую память (возможно, виртуальную), доступную для ваших задач, включая определения кучи, стека и класса:
Hadoop 0.x, 1.x (deprecated) Hadoop 2.x
------------------------------- --------------------------
mapred.job.map.memory.mb mapreduce.map.memory.mb
mapred.job.reduce.memory.mb mapreduce.reduce.memory.mb
Я предлагаю установить -Xmx
на 75% от значений memory.mb
.
В кластере YARN задания не должны использовать больше памяти, чем конфигурацию на стороне сервера yarn.scheduler.maximum-allocation-mb
или они будут убиты.
Чтобы проверить значения по умолчанию и их приоритет, см. JobConf
и MRJobConfig
в исходном коде Hadoop.
Устранение неполадок
Помните, что ваш mapred-site.xml может предоставлять значения по умолчанию для этих параметров. Это может ввести в заблуждение. если ваше задание mapred.child.java.opts
программно, это не повлияет, если mapred-site.xml устанавливает mapreduce.map.java.opts
или mapreduce.reduce.java.opts
. Вам нужно будет установить эти свойства в своей задаче вместо этого, чтобы переопределить mapred-site.xml. Проверьте страницу настройки своей работы (найдите "xmx" ), чтобы узнать, какие значения были применены и откуда они пришли.
Память ApplicationMaster
В кластере YARN вы можете использовать следующие два свойства для управления объемом памяти, доступной вашему ApplicationMaster (для хранения деталей разбиений на входные данные, состояния задач и т.д.):
Hadoop 0.x, 1.x Hadoop 2.x
------------------------------- --------------------------
yarn.app.mapreduce.am.command-opts
yarn.app.mapreduce.am.resource.mb
Опять же, вы можете установить -Xmx
(в первом) на 75% от значения resource.mb
.
Другие конфигурации
Существует множество других конфигураций, относящихся к ограничениям памяти, некоторые из которых устарели - см. класс JobConf
. Один полезный:
Hadoop 0.x, 1.x (deprecated) Hadoop 2.x
------------------------------- --------------------------
mapred.job.reduce.total.mem.bytes mapreduce.reduce.memory.totalbytes
Установите это значение в низкое значение (10), чтобы заставить случайное перемещение на диске в случае, если вы нажмете OutOfMemoryError
на MapOutputCopier.shuffleInMemory
.