ошибка нехватки памяти в 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 я мог бы сделать что-то глупое . Любое предложение будет высоко ценится.



anuj@anuj-VPCEA13EN:~/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 : org.apache.hadoop.util.LinuxResourceCalculatorPlugin@e49dcd
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)
741   14  

14 ответов:

вы можете назначить больше памяти, отредактировав сайт conf/mapred.xml-файл и добавление свойства:

  <property>
    <name>mapred.child.java.opts</name>
    <value>-Xmx1024m</value>
  </property>

Это позволит запустить Hadoop на виртуальных машинах с больше пространства кучи.

для тех, кто использует пакеты RPM или DEB, документация и общие рекомендации вводят в заблуждение. Эти пакеты устанавливают файлы конфигурации hadoop в /etc / hadoop. Они будут иметь приоритет над другими параметрами.

the /etc/hadoop/hadoop-env.sh устанавливает максимальную память кучи java для Hadoop, по умолчанию это:

   export HADOOP_CLIENT_OPTS="-Xmx128m $HADOOP_CLIENT_OPTS"

Эта настройка Xmx слишком низкая, просто измените ее на эту и повторите

   export HADOOP_CLIENT_OPTS="-Xmx2048m $HADOOP_CLIENT_OPTS"

еще одна возможность редактирования hadoop-env.sh, которая содержит export HADOOP_CLIENT_OPTS="-Xmx128m $HADOOP_CLIENT_OPTS". Изменение 128m на 1024m помогло в моем случае (Hadoop 1.0.0.1 на Debian).

после попытки так много комбинаций, наконец, я пришел к выводу, что та же ошибка в моей среде (Ubuntu 12.04, Hadoop 1.0.4) вызвана двумя проблемами.

  1. то же, что и Зак геймер, упомянутый выше.
  2. не забудьте сначала выполнить "ssh localhost". Веришь или нет! Никакой ssh не будет выдавать сообщение об ошибке на Java heap space.

вам нужно внести коррективы в mapreduce.{map|reduce}.java.opts и mapreduce.{map|reduce}.memory.mb.

например:

  hadoop jar <jarName> <fqcn> \
      -Dmapreduce.map.memory.mb=4096 \
      -Dmapreduce.map.java.opts=-Xmx3686m

здесь это хороший ресурс с ответом на этот вопрос

вы можете решить эту проблему, отредактировав файл /etc/hadoop/hadoop-env.sh.

Hadoop давал каталогу конфигурации/etc / hadoop приоритет над каталогом conf.

Я тоже столкнулся с такой же ситуацией.

выполнить вашу работу, как показано ниже:

bin/hadoop jar hadoop-examples-*.jar grep -D mapred.child.java.opts=-Xmx1024M input output 'dfs[a-z.]+' 

пространство кучи по умолчанию установлено в 32 Мб или 64 МБ. Вы можете увеличить пространство кучи в файле свойств, как указал Тюдор, или вы можете изменить его для этого конкретного задания, установив это свойство для этого конкретного задания.

Я установил hadoop 1.0.4 из двоичного tar и имел проблему с памятью. Я попробовал решения Тюдора, Зака Гарнера, Нишанта Нагвани и Андриса Биркманиса, но ни одно из них не сработало для меня.

редактирование 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 "
...

Я предполагаю, что есть лучший способ сделать это, но я не мог найти его.

то же самое исключение с Ubuntu, Hadoop 1.1.1. Решение было простым-изменить переменную оболочки $HADOOP_CLIENT_OPTS, заданную некоторым сценарием инициализации. Но это заняло много времени, чтобы найти его =(

мы столкнулись с той же ситуации.

модификации hadoop-env.sh сработало для меня.

EXPORT HADOOP_HEAPSIZE будет прокомментирован, раскомментируйте это и предоставьте размер по вашему выбору.

по умолчанию HEAPSIZE назначено 1000 МБ.

экспорт переменных с помощью следующей команды работал для меня:

. conf/hadoop-env.sh

на Ubuntu с помощью DEB install (по крайней мере для 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 запускается скрипт, обновляется переменная среды параметры клиента, сохраняя старое значение)

Я закончил с очень похожей проблемой на прошлой неделе. Мой входной файл, который я использовал, имел большую линию задницы, которую я не мог просмотреть. Эта строка была почти 95% от моего размера файла (95% от 1 ГБ! только представьте себе!). Я бы предложил вам сначала взглянуть на ваши входные файлы. Возможно, у вас есть неправильный входной файл, который вы хотите просмотреть. Попробуйте увеличить пространство "кучи" после проверки входного файла.

убедитесь, что mapreduce.child.java.opts достаточно памяти, необходимой для выполнения задания mapred. Также убедитесь, что 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 есть достаточно памяти, если настроен.

Comments

    Ничего не найдено.