Mahout内存不足

6
我正在使用Mahout在一组推文上运行NaiveBayes。有两个文件,一个100 MB,一个300 MB。我将JAVA_HEAP_MAX更改为JAVA_HEAP_MAX=-Xmx2000m(之前是1000)。但即使这样,mahout也在几个小时后(确切地说是2个小时)报告堆空间错误。我该怎么办才能解决问题?
如果有更多信息可以帮助的话:我正在单节点上运行,实际上是我的笔记本电脑,它只有3GB的RAM。
谢谢。
编辑:我第三次运行时使用了比第一次使用的数据少的数据量的一半以下(第一次我使用了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个回答

3

您没有说明是哪个进程耗尽了内存,这很重要。您需要设置MAHOUT_HEAPSIZE,而不是任何JAVA_HEAP_MAX


我在bin/mahout中看到了JAVA_HEAP_MAX并进行了更改(通过谷歌搜索获得建议)。我正在等待训练的结果(已经开始第三次),如果再次出现堆空间不足的情况,我将发布确切的错误消息以及已更改的bin/mahout脚本部分。 - crazyaboutliv

1

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

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


基本的EC2只有640MB的RAM。我的朋友和我在那里托管了我们的FB应用程序进行测试:)>是的,我想我会按照你所说的做,并减小数据集的大小,因为似乎没有其他选择:'(。我没有使用Hadoop,只是为了Mahout而更改了它。 - crazyaboutliv

0

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接