2012-03-28 4 views
5

Próbuję wykorzystać MOOP do trenowania wielu modeli. Moje dane są wystarczająco małe, aby zmieścić się w pamięci, więc chcę mieć jeden model przeszkolony w każdym zadaniu mapy.Hadoop: Łatwy sposób na obiekt jako wartość wyjściową bez interfejsu Zapisywalny

Mój problem polega na tym, że po ukończeniu szkolenia mojego modelu muszę wysłać go do reduktora. Używam Weka do szkolenia modelu. Nie chcę zaczynać szukać sposobu implementacji interfejsu Writable w klasach Weka, ponieważ wymaga to dużego nakładu pracy. Szukam prostego sposobu na zrobienie tego.

Klasyfikator klasy Weka implementuje interfejs Serializable. Jak mogę wysłać ten obiekt do reduktora?

 edits 

Oto link, który wspomina WEKA obiekty serializacji: http://weka.wikispaces.com/Serialization

Oto co mój kod wygląda następująco: Konfiguracja pracy (tylko część konfiguracji jest opublikowany):

 conf.set("io.serializations","org.apache.hadoop.io.serializer.JavaSerialization," + "org.apache.hadoop.io.serializer.WritableSerialization"); 
     job.setOutputKeyClass(Text.class); 
     job.setOutputValueClass(Classifier.class); 
funkcja

mapa

 //load dataset in data variable 
    Classifier tree=new J48(); 
    tree.buildClassifier(); 
    context.write(new Text("whatever"), tree); 

Moja klasa Mapa rozciąga Mapper (obiekt, tekst, tekst, klasyfikator)

ale otrzymuję ten błąd:

 java.lang.NullPointerException 
at org.apache.hadoop.io.serializer.SerializationFactory.getSerializer(SerializationFactory.java:73) 
at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.<init>(MapTask.java:964) 
at org.apache.hadoop.mapred.MapTask$NewOutputCollector.<init>(MapTask.java:673) 
at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:755) 
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:369) 
at org.apache.hadoop.mapred.Child$4.run(Child.java:259) 
at java.security.AccessController.doPrivileged(Native Method) 
at javax.security.auth.Subject.doAs(Subject.java:416) 
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1059) 
at org.apache.hadoop.mapred.Child.main(Child.java:253) 

co robię źle ??

Odpowiedz

6

Można zdefiniować własny mechanizm serializacji

myślę, że to rozwiązuje się wokół realizacji interfejs serializacji i definiowania wdrożenie w nieruchomości io.serializations konfiguracji

W twoim przypadku, jeśli chcesz po prostu użyć java serial zację, ustawić tę właściwość:

  • org.apache.hadoop.io.serializer.JavaSerialization
+0

Ohh thanks..I będzie to sprawdzić już dziś i zakładać żadnych dodatkowych pytań. – jojoba

+0

Wprowadziłem kilka zmian, ponieważ mam problem. – jojoba

+0

Tekst zdecydowanie nie implementuje Serializable, więc hadoop nie wie, jak sobie z tym poradzić - możesz użyć zarówno serializacji Java jak i hadoop razem - ustaw 'io.serializations' na" org.apache.hadoop.io.serializer.JavaSerialization , org.apache.hadoop.io.serializer.WritableSerialization' –

Powiązane problemy