Ошибка: куча Java-кучи

В Ubuntu, когда я запускаю пример hadoop:

$bin/hadoop jar hadoop-examples-1.0.4.jar grep input output 'dfs[a-z.]+' 

$echo $HADOOP_HEAPSIZE
2000

В журнале я получаю сообщение об ошибке:

INFO mapred.JobClient: Идентификатор задачи: попытка_201303251213_0012_m_000000_2, Статус: FAILED Ошибка: куча Java-памяти 13/03/25 15:03:43 INFO mapred.JobClient: Идентификатор задачи: попытка_201303251213_0012_m_000001_2, Статус: FAILED Ошибка: Java heap space13/03/25 15:04:28 INFO mapred.JobClient: Job Failed: # неудачных заданий карты превысил допустимый предел. FailedCount: 1. LastFailedTask: task_201303251213_0012_m_000000 java.io.IOException: сбой задания! в org.apache.hadoop.mapred.JobClient.runJob(JobClient.java:1265) at org.apache.hadoop.examples.Grep.run(Grep.java:69) в org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:65) в org.apache.hadoop.examples.Grep.main(Grep.java:93)

Сообщите нам, в чем проблема.

Ответы

Ответ 1

Очевидно, что вы исчерпали размер кучи, выделенный на Java. Поэтому вы попытаетесь увеличить это.

Для этого вы можете выполнить следующее перед выполнением команды hadoop:

export HADOOP_OPTS="-Xmx4096m"

В качестве альтернативы вы можете добиться того же, добавив в свой mapred-site.xml следующий постоянный параметр, этот файл находится в HADOOP_HOME/conf/:

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

Это установит ваше пространство кучи java на 4096 МБ (4 ГБ), вы можете даже попробовать его с более низким значением, если это сработает. Если это тоже не сработает, увеличьте его больше, если ваша машина поддержит его, а затем не перейдет на машину с большим объемом памяти и попробуйте там. Поскольку кучное пространство просто означает, что у вас недостаточно памяти для Java.

UPDATE: Для Hadoop 2+ внесите изменения в mapreduce.map.java.opts.

Ответ 2

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

Работает для меня.

экспортировать HADOOP_OPTS = "- Xmx4096m"

не работает

Ответ 3

Используя Hadoop 2.5.0-cdh5.2.0, это помогло мне изменить размер кучи локального (последовательного) Java-процесса:

export HADOOP_HEAPSIZE=2900
hadoop jar analytics.jar .....

Причина, по которой она работала, заключается в том, что /usr/lib/hadoop/libexec/hadoop -config.sh имеет

# check envvars which might override default args
if [ "$HADOOP_HEAPSIZE" != "" ]; then
  #echo "run with heapsize $HADOOP_HEAPSIZE"
  JAVA_HEAP_MAX="-Xmx""$HADOOP_HEAPSIZE""m"
  #echo $JAVA_HEAP_MAX
fi

Ответ 4

Если вы добавляете свойство на mapred-site.xml

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

Иногда бывает другое потому что это больше, чем ограничение виртуальной памяти В этой ситуации, вы должны добавить

<property>
        <name>yarn.nodemanager.vmem-pmem-ratio</name>
        <value>4.2</value>
</property>

на сайте yarn-site.xml

потому что его значение по умолчанию 2.1G иногда слишком мало.