Ошибка отсутствия памяти в фазе перетасовки Mapreduce
Я получаю странные ошибки при запуске программы wordcount-like mapreduce. У меня есть кластер hadoop с 20 подчиненными устройствами, каждый из которых имеет 4 ГБ оперативной памяти. Я сконфигурировал задачи своей карты, чтобы иметь кучу 300 МБ, и мои уменьшенные слоты задач получают 1 ГБ. У меня есть 2 слота для карт и 1 слот для сокращения на node. Все идет хорошо, пока не завершится первый раунд картографических задач. Затем прогресс остается на уровне 100%. Я полагаю, что тогда происходит фаза копирования. Каждая задача карты генерирует что-то вроде:
Map output bytes 4,164,335,564
Map output materialized bytes 608,800,675
(Я использую SnappyCodec для сжатия)
После остановки в течение часа задачи сокращения сокращаются со следующим исключением:
Error: java.lang.OutOfMemoryError: Java heap space at
org.apache.hadoop.mapred.ReduceTask$ReduceCopier$MapOutputCopier.shuffleInMemory(ReduceTask.java:1703) at
org.apache.hadoop.mapred.ReduceTask$ReduceCopier$MapOutputCopier.getMapOutput(ReduceTask.java:1563) at
org.apache.hadoop.mapred.ReduceTask$ReduceCopier$MapOutputCopier.copyOutput(ReduceTask.java:1401) at
org.apache.hadoop.mapred.ReduceTask$ReduceCopier$MapOutputCopier.run(ReduceTask.java:1333
Я был googling и нашел эту ссылку, но я действительно не знаю, что с этим делать:
общая ссылка hadoop
Я не понимаю, почему у hadoop возникли проблемы с копированием и слиянием, если он сможет выполнить тестовый тестер. Не может быть, чтобы весь вывод карты вписывался в ОЗУ редукторной нити. Итак, что здесь происходит?
В приведенной выше ссылке они обсуждают настройку следующих параметров:
mapreduce.reduce.shuffle.input.buffer.percent = 0.7
mapreduce.reduce.shuffle.memory.limit.percent = 0.25
mapreduce.reduce.shuffle.parallelcopies = 5
Они утверждают, что тот факт, что произведение параметров > 1, позволяет печатать ошибки с ошибками.
EDIT: Обратите внимание, что 5 * 1,25 * 0,7 все еще < 1, так что сосредоточьтесь на моем втором решении!!
Прежде чем перезапустить эту интенсивную симуляцию, я был бы очень рад услышать о ком-то мнение относительно проблемы, с которой я столкнулся, так как это беспокоит почти неделю. Я также, кажется, не совсем понимаю, что происходит в этой фазе копирования, я бы ожидал, что сортировка слияния на диске не потребует большого размера кучи?
Большое спасибо за любые полезные комментарии и ответы!
Ответы
Ответ 1
Я думаю, что ключом является то, что для моей фазы сокращения требуется почти полное уничтожение моей задачи уменьшения. Но фаза shuffle конкурирует за ту же самую кучу, возникший конфликт привел к сбою моей работы. Я думаю, это объясняет, почему работа больше не сбой, если я опускаю shuffle.input.buffer.percent
.
Ответ 2
Параметр, который вы указываете mapred.job.shuffle.input.buffer.percent
, по-видимому, является параметром pre Hadoop 2. Я мог найти этот параметр в файле mapred-default.xml в 1.04 docs, но его имя изменилось на mapreduce.reduce.shuffle.input.buffer.percent
на 2.2.0 docs.
В документах это описание параметра:
Процентная доля памяти, которая должна быть выделена из максимального размера кучи, для хранения выходов карты во время тасования.
Для полного понимания сортировки и перемешивания см. главу 6.4 окончательного руководства Hadoop. В этой книге представлено альтернативное определение параметра mapred.job.shuffle.input.buffer.percent
:
Доля общего размера кучи, которая должна быть отнесена к буферу выходов карты во время фазы копирования тасования.
Поскольку вы заметили, что уменьшение значения mapred.job.shuffle.input.buffer.percent
по умолчанию от 0.7
до 0.2
решило вашу проблему, вполне можно сказать, что вы могли бы также решить свою проблему, увеличив значение редуктора размер кучи.
Ответ 3
Даже после изменения shuffle.input.buffer.percent
до 0.2 он не работает для меня и получил ту же ошибку.
После того, как вы сделали хит и пробную версию в одиночном кластере node, я обнаружил, что в каталоге /
должно быть достаточно места, так как процесс использует это пространство в случае разлива.
Также необходимо изменить каталог разлива.
Ответ 4
Связанная ошибка - https://issues.apache.org/jira/browse/MAPREDUCE-6724
Может вызывать исключение NegativeArraySizeException, если вычисленное значение maxSingleShuffleLimit > MAX_INT