Как избежать исключения OutOfMemoryException при запуске Hadoop?

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

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

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

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

Ответы

Ответ 1

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

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

Максимальные задачи могут быть настроены на 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 ядром, тогда пришло время получить новое оборудование для ваших данных node или установить задачи маски на 1. Если у вас 1 процессор с 4 ядра, то установка карты на 3 и сокращение до 3 будет хорошей (сохранение 1 ядро ​​для демона).

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

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

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