【问题标题】:Mahout runs out of heap spaceMahout 堆空间不足
【发布时间】:2011-08-26 22:18:04
【问题描述】:

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

如果有帮助,请提供更多信息:我在单个节点上运行,我的笔记本电脑实际上具有 3GB 的 RAM(仅)。

谢谢。

编辑:我第三次使用

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

【问题讨论】:

    标签: mahout


    【解决方案1】:

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

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

    【讨论】:

    • 基本 ec2 是 640 MB 的 RAM> 我和我的朋友在那里托管了 fb 应用程序,用于测试 :)> 是的,我想我会按照你说的做,并将数据集的大小减小为似乎没有其他办法了:'(。我没有使用 Hadoop。只为 Mahout 更改了它
    【解决方案2】:

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

    【讨论】:

    • 我在 bin/mahout 中看到了 JAVA_HEAP_MAX 并对其进行了更改(获得了有关谷歌搜索的建议)。我正在等待培训结束(第 3 次开始),如果它再次用完堆空间,我将发布确切的错误消息和已更改的 bin/mahout 脚本部分
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2012-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-17
      • 2011-10-08
      • 2013-01-03
      • 2020-01-26
      相关资源
      最近更新 更多