2011-05-17 10 views
5

Estoy ejecutando NaiveBayes en un conjunto de tweets usando Mahout. Dos archivos, uno de 100 MB y otro de 300 MB. Cambié JAVA_HEAP_MAX a JAVA_HEAP_MAX = -Xmx2000m (anteriormente era 1000). Pero incluso entonces, mahout se ejecutó durante unas horas (2 para ser precisos) antes de que se quejara de un error de espacio en el montón. ¿Qué debo hacer para resolver?Mahout se queda sin espacio en el montón

Más información si ayuda: Estoy funcionando en un solo nodo, mi portátil de hecho tiene 3 GB de RAM (solamente).

Gracias.

EDIT: ejecuté por tercera vez con < 1/2 de los datos que utilicé la primera vez (la primera vez que utilicé 5.5 millones de tweets, segundo usé 2million) y todavía tengo un problema de montón de espacio. He colgado el error completo, para completar:

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) 

Y me anuncio por parte del script bin/mahout que he cambiado: original:

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 

modificación:

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 

Respuesta

1

¿Modificó el tamaño del montón para el entorno de hadoop o el mahout? Ver si este query en mahout list ayuda. Por experiencia personal, puedo sugerirle que reduzca el tamaño de los datos que está tratando de procesar. Cada vez que intentaba ejecutar el clasificador Bayes en mi computadora portátil, después de correr por unas horas, el espacio del montón se agotaba.

Sugiero que ejecute esto en EC2. Creo que la opción básica de S3/EC2 es gratuita.

+0

Basic ec2 es 640 MB de RAM> Mi amigo y yo alojamos la aplicación fb allí, para probar:)> Sí, creo que haré lo que ha dicho y reduciré el tamaño del conjunto de datos, ya que parece no haber otro ir: '(. No estoy usando Hadoop. Solo lo cambié por Mahout – crazyaboutliv

2

No está especificando qué proceso se quedó sin memoria, lo cual es importante. Debe configurar MAHOUT_HEAPSIZE, no lo que JAVA_HEAP_MAX es.

+0

Vi JAVA_HEAP_MAX en bin/mahout y lo cambié (recibí el consejo de buscar en Google). Estoy esperando la conclusión del entrenamiento (comencé por tercera vez) y si de nuevo se queda sin espacio en el montón, publicaré el mensaje de error exacto y las partes del script bin/mahout que se cambiaron – crazyaboutliv

0

Cuando comience el proceso de mahout, puede ejecutar "jps" que mostrará todo el proceso de java que se ejecuta en su máquina con su id de usuario. "jps" le devolverá una identificación de proceso. Puede encontrar el proceso y puede ejecutar "jmap -heap process-id" para ver su utilización de espacio dinámico.

Con este enfoque puede estimar en qué parte de su memoria de procesamiento se agota y dónde necesita aumentar.

Cuestiones relacionadas