2015-05-25 2 views
1

В настоящее время я пытаюсь классифицировать данные с частичной реализацией randomforest в Mahout.Mahout - TestForest не может вычислить окончательный анализ (матрица смешения, точность, kappa и т. Д.)

Хотя я смог классифицировать определенные объемы данных с помощью набора исправлений обученных лесов, я не могу сделать это с более крупными данными (примерно в два раза большими) и теми же классификаторами.

Фактически, классификация, выполняемая во время MR, отлично работает и показала, что она успешна. К сожалению, когда анализ вычисляется, он всегда заканчивается исключением OutOfMemoryException, которое могло произойти из-за достигнутого GCOverheadLimit. Я также добавил опцию:

-Dmapred.child.java.opts = "- Xmx20g -XX: -UseGCOverheadLimit"

на вызов, но это не помогло.

Я помню времена, когда я использовал более раннюю версию mahout (я думаю, это было 0,7), которая могла бы классифицировать почти произвольно большие наборы данных с помощью метода testforest, а также выводить аналитические меры, такие как матрица путаницы и т. Д. I я смущен, почему самый простой шаг во всем процессе приводит к таким ошибкам.

Есть ли способ исправить это легко?

Вот один из журналов:

15/05/25 13:58:26 INFO mapreduce.Job: map 97% reduce 0% 
15/05/25 13:58:46 INFO mapreduce.Job: map 98% reduce 0% 
15/05/25 13:59:43 INFO mapreduce.Job: map 99% reduce 0% 
15/05/25 14:01:20 INFO mapreduce.Job: map 100% reduce 0% 
15/05/25 14:02:11 INFO mapreduce.Job: Job job_1432549186261_0032 completed successfully 
15/05/25 14:02:12 INFO mapreduce.Job: Counters: 33 
    File System Counters 
     FILE: Number of bytes read=2202834240 
     FILE: Number of bytes written=3408230 
     FILE: Number of read operations=0 
     FILE: Number of large read operations=0 
     FILE: Number of write operations=0 
     HDFS: Number of bytes read=580537741 
     HDFS: Number of bytes written=343262060 
     HDFS: Number of read operations=150 
     HDFS: Number of large read operations=0 
     HDFS: Number of write operations=60 
    Job Counters 
     Failed map tasks=9 
     Launched map tasks=39 
     Other local map tasks=19 
     Data-local map tasks=17 
     Rack-local map tasks=3 
     Total time spent by all maps in occupied slots (ms)=3387270 
     Total time spent by all reduces in occupied slots (ms)=0 
     Total time spent by all map tasks (ms)=3387270 
     Total vcore-seconds taken by all map tasks=3387270 
     Total megabyte-seconds taken by all map tasks=10405693440 
    Map-Reduce Framework 
     Map input records=16993025 
     Map output records=16993045 
     Input split bytes=4950 
     Spilled Records=0 
     Failed Shuffles=0 
     Merged Map outputs=0 
     GC time elapsed (ms)=15935 
     CPU time spent (ms)=1798740 
     Physical memory (bytes) snapshot=27353509888 
     Virtual memory (bytes) snapshot=102048583680 
     Total committed heap usage (bytes)=58348666880 
    File Input Format Counters 
     Bytes Read=580532791 
    File Output Format Counters 
     Bytes Written=343262060 
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space 
    at org.apache.mahout.classifier.df.mapreduce.Classifier.parseOutput(Classifier.java:169) 
    at org.apache.mahout.classifier.df.mapreduce.Classifier.run(Classifier.java:130) 
    at org.apache.mahout.classifier.df.mapreduce.TestForest.mapreduce(TestForest.java:188) 
    at org.apache.mahout.classifier.df.mapreduce.TestForest.testForest(TestForest.java:174) 
    at org.apache.mahout.classifier.df.mapreduce.TestForest.run(TestForest.java:146) 
    at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70) 
    at org.apache.mahout.classifier.df.mapreduce.TestForest.main(TestForest.java:315) 
    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:606) 
    at org.apache.hadoop.util.ProgramDriver$ProgramDescription.invoke(ProgramDriver.java:72) 
    at org.apache.hadoop.util.ProgramDriver.run(ProgramDriver.java:145) 
    at org.apache.hadoop.util.ProgramDriver.driver(ProgramDriver.java:153) 
    at org.apache.mahout.driver.MahoutDriver.main(MahoutDriver.java:195) 
    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:606) 
    at org.apache.hadoop.util.RunJar.main(RunJar.java:212) 

ответ

1

Хорошо, я нашел решение, хотя неясно мне, почему это работает:

Добавление ...

export HADOOP_CLIENT_OPTS="-Xmx20192m"

... к сценарию сделал трюк.

Использование MAHOUT_HEAPSIZE=40000 или -Dmapred.child.java.opts не помогло.

Я нашел вдохновение для решения здесь: https://community.cloudera.com/t5/Data-Science-and-Machine/Java-heap-size-running-mahout-clusterdump/td-p/7752

Если у вас есть подобные проблемы, вы можете быть заинтересованы в создании переменных, которые можно найти в сценарии погонщика, который также доступен на сайте:

https://svn.apache.org/repos/asf/mahout/trunk/bin/mahout