Кучи редуктора не хватает памяти - PullRequest
0 голосов
/ 03 января 2012

Итак, у меня есть несколько сценариев Pig, которые продолжают умирать там, сокращая фазу работы с ошибками, которые Java-куча продолжает исчерпывать.На сегодняшний день мое единственное решение - увеличить количество редукторов, но это, похоже, не дает мне уверенности.Теперь отчасти это может быть просто огромный рост данных, которые мы получаем, но не уверен.

Я думал об изменении настройки порога разлива, не могу вспомнить настройку, но не уверенесли бы они помогли или просто замедлили это.Что еще я могу предпринять, чтобы решить эту проблему?

В дополнение к этому, когда это иногда происходит, я также получаю ошибки о том, что bash не удается получить память для операции разлива.Будет ли у этого узла Hadoop нехватка памяти?Если это так, будет ли решение проблемы уменьшения размера кучи на этих полях?

Редактировать 1
1) Свинья 0.8.1
2) Единственный UDF - это evaludf, который просто смотрит на отдельные ряды без сумок или карт.
3) Я не заметил, чтобы были какие-то горячие точки с плохим распределением ключей.Я также использовал шкалу простых чисел, чтобы уменьшить эту проблему.

Изменить 2
Вот ошибка, о которой идет речь:
2012-01-04 09:58:11,179 FATAL org.apache.hadoop.mapred.TaskRunner: attempt_201112070707_75699_r_000054_1 : Map output copy failure : java.lang.OutOfMemoryError: Java heap space at org.apache.hadoop.mapred.ReduceTask$ReduceCopier$MapOutputCopier.shuffleInMemory(ReduceTask.java:1508) at org.apache.hadoop.mapred.ReduceTask$ReduceCopier$MapOutputCopier.getMapOutput(ReduceTask.java:1408) at org.apache.hadoop.mapred.ReduceTask$ReduceCopier$MapOutputCopier.copyOutput(ReduceTask.java:1261) at org.apache.hadoop.mapred.ReduceTask$ReduceCopier$MapOutputCopier.run(ReduceTask.java:1195)

Вот ошибка bash, которую я продолжаю получать:
java.io.IOException: Task: attempt_201112070707_75699_r_000054_0 - The reduce copier failed at org.apache.hadoop.mapred.ReduceTask.run(ReduceTask.java:380) at org.apache.hadoop.mapred.Child.main(Child.java:170) Caused by: java.io.IOException: Cannot run program "bash": java.io.IOException: error=12, Cannot allocate memory at java.lang.ProcessBuilder.start(ProcessBuilder.java:460) at org.apache.hadoop.util.Shell.runCommand(Shell.java:149) at org.apache.hadoop.util.Shell.run(Shell.java:134) at org.apache.hadoop.fs.DF.getAvailable(DF.java:73) at org.apache.hadoop.fs.LocalDirAllocator$AllocatorPerContext.getLocalPathForWrite(LocalDirAllocator.java:329) at org.apache.hadoop.fs.LocalDirAllocator.getLocalPathForWrite(LocalDirAllocator.java:124) at org.apache.hadoop.mapred.MapOutputFile.getInputFileForWrite(MapOutputFile.java:160) at org.apache.hadoop.mapred.ReduceTask$ReduceCopier$InMemFSMergeThread.doInMemMerge(ReduceTask.java:2537) at org.apache.hadoop.mapred.ReduceTask$ReduceCopier$InMemFSMergeThread.run(ReduceTask.java:2501)

Ответы [ 2 ]

3 голосов
/ 03 января 2012

Очевидно, вам не хватает памяти где-то. Увеличение количества редукторов на самом деле вполне разумно. Посмотрите статистику веб-интерфейса JobTracker и посмотрите, сколько байтов выходит из картографа. Разделите это на количество задач сокращения, и это довольно приблизительная оценка того, что получает каждый редуктор. К сожалению, в долгосрочной перспективе это работает, только если ваши ключи распределены равномерно.

В некоторых случаях JOIN (особенно реплицированный вид) вызовет этот тип проблемы. Это происходит, когда у вас есть «горячая точка» определенного ключа. Например, предположим, что вы выполняете какое-то соединение, и один из этих ключей отображается в 50% случаев. Какому-либо редуктору посчастливится справиться с этим ключом, он будет забит. Возможно, вы захотите выяснить, какие клавиши вызывают горячие точки, и соответственно обработать их. По моим данным, эти горячие точки обычно бесполезны. Чтобы узнать, что горячо, просто наберите GROUP BY и COUNT и выясните, что часто появляется. Тогда, если это бесполезно, просто FILTER из него.

Другим источником этой проблемы является UDF Java, который агрегирует слишком много данных. Например, если у вас есть UDF, который проходит через пакет данных и собирает записи в какую-то структуру данных списка, возможно, вы перегружаете свою память значением горячей точки.

Я обнаружил, что более новые версии Pig (особенно версии .8 и .9) имеют гораздо меньше проблем с памятью. У меня было довольно много случаев исчерпания кучи в .7. В этих версиях обнаружение дисков намного лучше, так что если он собирается уничтожить кучу, он достаточно умен, чтобы пролить на диск.


Чтобы я мог быть более полезным, вы можете опубликовать свой сценарий Pig, а также указать, какую версию Pig вы используете.

1 голос
/ 29 февраля 2012

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

Моя конкретная проблема заключалась в том, что на виртуальной машине не было настроено пространство подкачки, в конечном итоге ей не хватило бы памяти. Я предполагаю, что вы пытаетесь сделать это в правильной конфигурации Linux, но не мешало бы сделать: free -m и посмотреть, что вы получите в результате, возможно, проблема в том, что вы настроили слишком мало подкачки памяти. *

Просто мысль, дайте мне знать, если это поможет. Удачи в вашей проблеме!

...