Ошибка памяти в Hadoop
Я попытался установить Hadoop после этого http://hadoop.apache.org/common/docs/stable/single_node_setup.html документа.
Когда я попытался выполнить этот
bin/hadoop jar hadoop-examples-*.jar grep input output 'dfs[a-z.]+'
Я получаю следующее исключение
java.lang.OutOfMemoryError: Java heap space
Пожалуйста, предложите решение, чтобы я мог попробовать пример. Полное исключение указано ниже. Я новичок в Hadoop, я, возможно, сделал что-то немое. Любое предложение будет высоко оценено.
[email protected]:~/hadoop$ bin/hadoop jar hadoop-examples-*.jar grep input output 'dfs[a-z.]+'
11/12/11 17:38:22 INFO util.NativeCodeLoader: Loaded the native-hadoop library
11/12/11 17:38:22 INFO mapred.FileInputFormat: Total input paths to process : 7
11/12/11 17:38:22 INFO mapred.JobClient: Running job: job_local_0001
11/12/11 17:38:22 INFO util.ProcessTree: setsid exited with exit code 0
11/12/11 17:38:22 INFO mapred.Task: Using ResourceCalculatorPlugin : [email protected]
11/12/11 17:38:22 INFO mapred.MapTask: numReduceTasks: 1
11/12/11 17:38:22 INFO mapred.MapTask: io.sort.mb = 100
11/12/11 17:38:22 WARN mapred.LocalJobRunner: job_local_0001
java.lang.OutOfMemoryError: Java heap space
at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.<init>(MapTask.java:949)
at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:428)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:372)
at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:212)
11/12/11 17:38:23 INFO mapred.JobClient: map 0% reduce 0%
11/12/11 17:38:23 INFO mapred.JobClient: Job complete: job_local_0001
11/12/11 17:38:23 INFO mapred.JobClient: Counters: 0
11/12/11 17:38:23 INFO mapred.JobClient: Job Failed: NA
java.io.IOException: Job failed!
at org.apache.hadoop.mapred.JobClient.runJob(JobClient.java:1257)
at org.apache.hadoop.examples.Grep.run(Grep.java:69)
at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:65)
at org.apache.hadoop.examples.Grep.main(Grep.java:93)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.hadoop.util.ProgramDriver$ProgramDescription.invoke(ProgramDriver.java:68)
at org.apache.hadoop.util.ProgramDriver.driver(ProgramDriver.java:139)
at org.apache.hadoop.examples.ExampleDriver.main(ExampleDriver.java:64)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.hadoop.util.RunJar.main(RunJar.java:156)
Ответы
Ответ 1
Вы можете назначить больше памяти, отредактировав файл conf/mapred-site.xml и добавив свойство:
<property>
<name>mapred.child.java.opts</name>
<value>-Xmx1024m</value>
</property>
Это запустит JVM-хауп с большим количеством кучи.
Ответ 2
Для тех, кто использует пакеты RPM или DEB, документация и общие советы вводят в заблуждение. Эти пакеты устанавливают конфигурационные файлы hadoop в /etc/hadoop. Они будут иметь приоритет над другими настройками.
/etc/hadoop/hadoop-env.sh устанавливает максимальную память кучи java для Hadoop, по умолчанию это:
export HADOOP_CLIENT_OPTS="-Xmx128m $HADOOP_CLIENT_OPTS"
Эта настройка Xmx слишком низкая, просто измените ее на нее и снова запустите
export HADOOP_CLIENT_OPTS="-Xmx2048m $HADOOP_CLIENT_OPTS"
Ответ 3
Другой возможностью является редактирование hadoop-env.sh
, которое содержит export HADOOP_CLIENT_OPTS="-Xmx128m $HADOOP_CLIENT_OPTS"
.
Изменение в 128 м до 1024 м помогло в моем случае (Hadoop 1.0.0.1 на Debian).
Ответ 4
После того, как вы сделали так много комбинаций, я завершил ту же ошибку в своей среде (Ubuntu 12.04, Hadoop 1.0.4) из-за двух проблем.
- То же, что и Зак Геймер.
- не забудьте сначала выполнить "ssh localhost". Верьте или нет! Нет ssh также выдает сообщение об ошибке на кучу Java-кучи.
Ответ 5
Вам нужно внести изменения в mapreduce.{map|reduce}.java.opts
, а также в mapreduce.{map|reduce}.memory.mb
.
Например:
hadoop jar <jarName> <fqcn> \
-Dmapreduce.map.memory.mb=4096 \
-Dmapreduce.map.java.opts=-Xmx3686m
здесь - хороший ресурс с ответом на этот вопрос
Ответ 6
Вы можете решить эту проблему, отредактировав файл /etc/hadoop/hadoop-env.sh
.
Hadoop задавал приоритет каталога /etc/hadoop config над каталогом conf.
Я также встретился с той же ситуацией.
Ответ 7
Запустите свою работу, как показано ниже:
bin/hadoop jar hadoop-examples-*.jar grep -D mapred.child.java.opts=-Xmx1024M input output 'dfs[a-z.]+'
Площадь кучи, по умолчанию, установлена в 32 МБ или 64 МБ. Вы можете увеличить пространство кучи в файле свойств, как указал Тудор, или вы можете изменить его для этого конкретного задания, установив это свойство для этого конкретного задания.
Ответ 8
Я установил hadoop 1.0.4 из бинарного tar и имел проблему с памятью. Я попробовал решения Tudor's, Zach Garner's, Nishant Nagwani и Andris Birkmanis, но никто из них не работал у меня.
Редактирование bin/hadoop для игнорирования $HADOOP_CLIENT_OPTS сработало для меня:
...
elif [ "$COMMAND" = "jar" ] ; then
CLASS=org.apache.hadoop.util.RunJar
#Line changed this line to avoid out of memory error:
#HADOOP_OPTS="$HADOOP_OPTS $HADOOP_CLIENT_OPTS"
# changed to:
HADOOP_OPTS="$HADOOP_OPTS "
...
Я предполагаю, что есть лучший способ сделать это, но я не смог его найти.
Ответ 9
То же самое исключение с Ubuntu, Hadoop 1.1.1. Решение было простым - отредактируйте переменную оболочки $HADOOP_CLIENT_OPTS, установленную некоторым init script. Но на это ушло много времени = (
Ответ 10
Мы столкнулись с такой же ситуацией.
Модификация hadoop-env.sh
разработана для меня.
EXPORT HADOOP_HEAPSIZE
будет прокомментирован, раскомментируйте это и укажите размер по вашему выбору.
По умолчанию HEAPSIZE
назначен 1000 МБ.
Ответ 11
Настройте размер кучи JVM для вашей карты и сократите процессы. Эти размеры должны быть меньше физической памяти, которую вы настроили в предыдущем разделе. Как правило, они должны составлять 80% от размера настроек физической памяти YARN.
Сконфигурируйте mapreduce.map.java.opts
и mapreduce.reduce.java.opts
, чтобы установить карту и соответственно уменьшить размеры кучи, например,
<property>
<name>mapreduce.map.java.opts</name>
<value>-Xmx1638m</value>
</property>
<property>
<name>mapreduce.reduce.java.opts</name>
<value>-Xmx3278m</value>
</property>
Ответ 12
Экспорт переменных, запустив следующую команду для меня:
. conf/hadoop-env.sh
Ответ 13
В Ubuntu с использованием установки DEB (по крайней мере, для Hadoop 1.2.1) существует символическая ссылка /etc/profile.d/hadoop-env.sh
, созданная для /etc/hadoop/hadoop-env.sh
, которая заставляет ее загружаться каждый раз, когда вы входите в систему. По моему опыту это необязательно, поскольку /usr/bin/hadoop
сама оболочка в конечном итоге вызовет ее (через /usr/libexec/hadoop-config.sh
). В моей системе я удалил символическую ссылку, и я больше не получаю странные проблемы при изменении значения для -Xmx
в HADOOP_CLIENT_OPTIONS
(поскольку каждый раз, когда выполняется hadoop-env.sh
script, изменяется переменная среды параметров клиента, хотя сохраняя старое значение)
Ответ 14
На прошлой неделе у меня был очень похожий вопрос. Мой файл ввода, который я использовал, имел большую задницу, в которой я не мог видеть. Эта строка была почти на 95% от моего размера файла (95% от 1 ГБ! Представьте, что!). Я бы предложил вам сначала взглянуть на ваши входные файлы. Возможно, у вас есть неправильный входной файл, который вы хотите изучить. Попробуйте увеличить пространство кучи после проверки входного файла.
Ответ 15
Убедитесь, что для mapreduce.child.java.opts
требуется достаточная память для выполнения заданий с отображением. Также убедитесь, что mapreduce.task.io.sort.mb
должно быть меньше mapreduce.child.java.opts
.
Пример:
mapreduce.child.java.opts=Xmx2048m
mapreduce.task.io.sort.mb=100
В противном случае вы столкнетесь с проблемой OOM, даже если HADOOP_CLIENT_OPTS в hadoop-env.sh имеет достаточное количество памяти, если сконфигурировано.