2011-05-17 22 views
5

我在使用Mahout的一组推文上运行NaiveBayes。两个文件,一个100 MB和一个300 MB。我将JAVA_HEAP_MAX更改为JAVA_HEAP_MAX = -Xmx2000m(早些时候它是1000)。但即使如此,Mahout在抱怨堆空间错误之前跑了几个小时(准确地说是2个小时)。我该怎么做才能解决?Mahout用完堆空间

一些更多的信息,如果它有帮助:我运行在一个节点,我的笔记本电脑infact,它有3GB的RAM(只)。

谢谢。

编辑:我第一次运行它< 1/2我第一次使用的数据(第一次我使用了550万推文,第二次我使用了2百万),我仍然遇到了堆空间问题。我张贴完成的目的,完整的错误:

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 /亨利马乌脚本的一部分: 原文:

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 

回答

1

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

我建议你关闭EC2。我认为基本的S3/EC2选项是免费使用的。

+0

基本ec2是640 MB的RAM>我的朋友,我在那里主持了fb应用程序,用于测试:)>是的,我认为我会按照你所说的去做并减小数据集的大小,因为似乎没有其他去:'(。我没有使用Hadoop,只改变了Mahout – crazyaboutliv 2011-05-17 08:00:20

2

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

+0

我在bin/mahout中看到了JAVA_HEAP_MAX,并且改变了它(得到了关于使用Google的建议),我在等待训练结束(第三次开始)如果它再次用完堆空间,我将发布确切的错误消息以及已更改的bin/mahout脚本部分 – crazyaboutliv 2011-05-17 13:43:39

0

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

通过这种方法,您可以估计处理内存的哪部分耗尽以及需要增加哪些部分。