Mahout не хватает места в куче - PullRequest
5 голосов
/ 17 мая 2011

Я использую NaiveBayes для твитов, используя Mahout.Два файла, один 100 МБ и один 300 МБ.Я изменил JAVA_HEAP_MAX на JAVA_HEAP_MAX = -Xmx2000m (ранее это было 1000).Но даже тогда mahout работал в течение нескольких часов (2, если быть точным), прежде чем он пожаловался на ошибку пространства кучи.Что я должен сделать, чтобы решить?

Еще немного информации, если это поможет: я работаю на одном узле, мой ноутбук заражен и имеет 3 ГБ ОЗУ (только).

Спасибо.

РЕДАКТИРОВАТЬ: я запускал его в третий раз с <1/2 данных, которые я использовал в первый раз (впервые я использовал 5,5 миллиона твитов, второй я использовал 2 миллиона), и у меня все еще возникла проблема с кучей пространства,Я публикую полную ошибку для завершения: </p>

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 ]

2 голосов
/ 17 мая 2011

Вы не указываете, какой процесс исчерпал память, что важно. Вам нужно установить MAHOUT_HEAPSIZE, а не JAVA_HEAP_MAX.

1 голос
/ 17 мая 2011

Изменяли ли вы размер кучи для среды hadoop или mahout?Посмотрите, поможет ли этот запрос в списке mahout.Исходя из личного опыта, я могу предложить вам уменьшить размер данных, которые вы пытаетесь обработать.Всякий раз, когда я пытался выполнить классификатор Байеса на своем ноутбуке, после нескольких часов работы пространство кучи истощалось.

Я бы предложил вам запустить это из EC2.Я думаю, что базовая опция S3 / EC2 бесплатна для использования.

0 голосов
/ 19 марта 2014

Когда вы запускаете процесс mahout, вы можете запустить "jps", он покажет все процессы Java, запущенные на вашей машине, с вашим идентификатором пользователя. «jps» вернет вам идентификатор процесса. Вы можете найти этот процесс и запустить «jmap -heap process-id», чтобы увидеть использование вашего пространства кучи.

При таком подходе вы можете оценить, какая часть вашей памяти обработки исчерпана и где вам нужно увеличить.

...