2010-08-01 3 views
14

Я выполняю работу Hadoop более 1,5 ТБ данных с большим количеством совпадений. У меня есть несколько машин с 16 ГБ оперативной памяти, и я всегда получаю OutOfMemoryException на этой работе с этими данными (я использую Hive).Как избежать исключения OutOfMemoryException при запуске Hadoop?

Я хотел бы знать, как оптимально установить опцию HADOOP_HEAPSIZE в файле hadoop-env.sh, поэтому моя работа не подведет. Возможно ли установить эту опцию, чтобы мои задания не сработали?

Когда я установил HADOOP_HEAPSIZE на 1,5 ГБ и удалил половину соответствия шаблону из запроса, работа выполняется успешно. Итак, каков этот вариант, если он не помогает избежать сбоев в работе?

Мне нужно больше экспериментировать с оптимальной настройкой, но, поскольку эти задания занимают> 10 часов, я прошу совета.

+0

Что заставляет вас думать, что 'HADOOP_HEAPSIZE' делает * не * помогает избежать сбоя? Похоже на ваш опыт, что он делает. По причинам, которые могут быть известны только при проверке ваших данных/заданий, ваша ситуация требует размера кучи, по крайней мере, такого большого. Можете ли вы реорганизовать свою работу, чтобы она не нуждалась в такой большой куче? –

+0

Я изменил свою работу, поэтому она не использует такую ​​большую кучу, но и в это время я изменил «HADOOP_HEAPSIZE». И я не вижу реального исхода этого чана, я имею в виду: зачем устанавливать кучу меньше: amount_of_my_RAM/number_of_mappers_or_reducers? – wlk

ответ

13

Неудачно ли работа или ваш сервер рушится? Если ваше задание терпит неудачу из-за OutOfMemmory на узлах, вы можете tweek количество максимальных карт и редукторов, а JVM выбирает для каждого так, что этого никогда не произойдет. mapred.child.java.opts (значение по умолчанию - 200Xmx) обычно должно быть увеличено на основе ваших конкретных узлов данных.

http://allthingshadoop.com/2010/04/28/map-reduce-tips-tricks-your-first-real-cluster/

Max задачи могут быть установлены на NameNode или переопределены (и установить конечный) на узлах данных, которые могут иметь различные конфигурации аппаратных средств. Максимальные задачи настраиваются как для карт, так и для редукторов. Чтобы вычислить это, он основан на ЦП (ядрах) и объеме ОЗУ, а также максимальную настройку JVM в mapred.child.java.opts (по умолчанию - 200). Каждый Datanode и Tasktracker имеют значение 1GB, поэтому для машины с 8 Гбайтами mapred.tasktracker.map.tasks.maximum может быть установлен в 7, а mapred.tasktracker.reduce.tasks.maximum - 7 с mapred.child.java .opts установлен на -400Xmx (предполагается 8 ядер). Обратите внимание, что эти максимальные значения заданий выполняются вашим процессором, если у вас только 1 процессор с 1 ядром, тогда пришло время получить новое оборудование для вашего узла данных или установить задачи маски на 1. Если у вас 1 процессор с 4 ядрами, тогда настройка карты на 3 и сокращение до 3 будет хорошей (сохранение 1 ядро ​​для демона).

По умолчанию используется только один редуктор, и вам необходимо настроить mapred.reduce.tasks более чем на один. Это значение должно быть где-то между 0,95 и 1,75 раза больше количества заданий на узел за раз число узлов данных. Поэтому, если у вас есть 3 узла данных, и это настройка максимальных задач из 7, тогда настройте это между 25 и 36.

Если ваш сервер рушится с проблемами OutOfMemory, тогда HADOOP_HEAPSIZE приходит только для кучи процессов (не выполнение задачи).

Наконец, если ваше задание выполняется так долго, вы можете проверить, есть ли у вас другое хорошее дополнение к конфигурации mapred.compress.map.output. Установка этого значения в значение true (баланс между временем сжатия и передачей) ускоряет копирование редукторов, особенно при работе с большими наборами данных. Часто рабочие места занимают много времени, но есть также варианты настройки, чтобы помочь ускорить работу вверх = 8 ^)

Смежные вопросы