Ошибка: куча 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 иногда слишком мало.