Подтвердить что ты не робот

Ошибка памяти в 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)
4b9b3361

Ответ 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 имеет достаточное количество памяти, если сконфигурировано.