Как избежать OutOfMemoryException при выполнении Hadoop?

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

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

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

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

14
задан wlk 1 August 2010 в 19:22
поделиться

1 ответ

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

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

Максимальные задачи могут быть установлены на узле Namenode или переопределены (и установлены окончательно) на узлах данных, которые могут иметь различные аппаратные конфигурации. Максимальные задачи устанавливаются как для mappers, так и для reducers. Для расчета этого параметра используется CPU (ядра) и объем оперативной памяти, а также максимальное количество JVM, установленное в mapred.child.java.opts (по умолчанию 200). Datanode и Tasktracker установлены на 1 ГБ каждый, поэтому для машины с 8 ГБ максимальное значение mapred.tasktracker.map.tasks.maximum может быть установлено на 7, а mapred.tasktracker.reduce.tasks.maximum - на 7, при этом mapred.child.java.opts установлен на -400Xmx (при условии 8 ядер). Обратите внимание, что эти максимальные задачи выполняются вашим процессором, если у вас только 1 процессор с 1 ядром, то пришло время приобрести новое оборудование для узла данных или установить маски задач на 1. Если у вас 1 процессор с 4 ядрами, то установить map на 3 и reduce на 3 будет хорошо (сохраняя 1 ядро для демона).

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

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

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

13
ответ дан 1 December 2019 в 14:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: