Mahout耗尽了堆空间

时间:2011-05-17 03:45:00

标签: mahout

我正在使用Mahout在一组推文上运行NaiveBayes。两个文件,一个100 MB,一个300 MB。我将JAVA_HEAP_MAX更改为JAVA_HEAP_MAX = -Xmx2000m(之前为1000)。但即便如此,在抱怨堆空间错误之前,mahout还是运行了几个小时(确切地说是2个小时)。我该怎么办才能解决?

如果它有帮助的话还有一些信息:我在一个节点上运行,我的笔记本电脑实际上它有3GB的RAM(仅限)。

感谢。

编辑:我第三次使用< 1/2我第一次使用的数据(第一次使用550万条推文,第二次使用了200万条)并且仍然遇到了堆空间问题。我发布了完整错误以完成目的:

17 May, 2011 2:16:22 PM
 org.apache.hadoop.mapred.JobClient monitorAndPrintJob
INFO:  map 50% reduce 0%

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at java.lang.AbstractStringBuilder.<init>(AbstractStringBuilder.java:62)
    at java.lang.StringBuilder.<init>(StringBuilder.java:85)
    at org.apache.hadoop.mapred.JobClient.monitorAndPrintJob(JobClient.java:1283)
    at org.apache.hadoop.mapred.JobClient.runJob(JobClient.java:1251)
    at org.apache.mahout.classifier.bayes.mapreduce.common.BayesFeatureDriver.runJob(BayesFeatureDriver.java:63)
    at org.apache.mahout.classifier.bayes.mapreduce.bayes.BayesDriver.runJob(BayesDriver.java:44)
    at org.apache.mahout.classifier.bayes.TrainClassifier.trainNaiveBayes(TrainClassifier.java:54)
    at org.apache.mahout.classifier.bayes.TrainClassifier.main(TrainClassifier.java:162)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:616)
    at org.apache.hadoop.util.ProgramDriver$ProgramDescription.invoke(ProgramDriver.java:68)
    at org.apache.hadoop.util.ProgramDriver.driver(ProgramDriver.java:139)
    at org.apache.mahout.driver.MahoutDriver.main(MahoutDriver.java:184)
17 May, 2011 7:14:53 PM org.apache.hadoop.mapred.LocalJobRunner$Job run
WARNING: job_local_0001
java.lang.OutOfMemoryError: Java heap space
    at java.lang.String.substring(String.java:1951)
    at java.lang.String.subSequence(String.java:1984)
    at java.util.regex.Pattern.split(Pattern.java:1019)
    at java.util.regex.Pattern.split(Pattern.java:1076)
    at org.apache.mahout.classifier.bayes.mapreduce.common.BayesFeatureMapper.map(BayesFeatureMapper.java:78)
    at org.apache.mahout.classifier.bayes.mapreduce.common.BayesFeatureMapper.map(BayesFeatureMapper.java:46)
    at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:50)
    at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:358)
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:307)
    at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:177)

我发布了我更改的bin / mahout脚本的一部分:  原文:

JAVA=$JAVA_HOME/bin/java
            JAVA_HEAP_MAX=-Xmx1000m 

if [ "$MAHOUT_HEAPSIZE" != "" ]; then
  #echo "run with heapsize $MAHOUT_HEAPSIZE"
  JAVA_HEAP_MAX="-Xmx""$MAHOUT_HEAPSIZE""m"
  #echo $JAVA_HEAP_MAX
fi

修改:

JAVA=$JAVA_HOME/bin/java
 JAVA_HEAP_MAX=-Xmx2000m 


if [ "$MAHOUT_HEAPSIZE" != "" ]; then
  #echo "run with heapsize $MAHOUT_HEAPSIZE"
  JAVA_HEAP_MAX="-Xmx""$MAHOUT_HEAPSIZE""m"
  #echo $JAVA_HEAP_MAX
fi

3 个答案:

答案 0 :(得分:2)

您没有指定哪个进程内存不足,这很重要。您需要设置MAHOUT_HEAPSIZE,而不是JAVA_HEAP_MAX

答案 1 :(得分:1)

您是否修改了hadoop环境或mahout环境的堆大小?查看mahout列表中的query是否有帮助。根据个人经验,我建议您减少要尝试处理的数据大小。每当我尝试在笔记本电脑上执行贝叶斯分类器时,运行几个小时后,堆空间就会耗尽。

我建议你在EC2上运行它。我认为基本的S3 / EC2选项可以免费使用。

答案 2 :(得分:0)

当你启动mahout进程时,你可以运行“jps”它将显示你的机器上运行的所有java进程和你的用户ID。 “jps”会返回一个进程ID。您可以找到该进程并运行“jmap -heap process-id”以查看堆空间利用率。

使用这种方法,您可以估算处理内存的哪个部分已耗尽,以及需要增加的位置。