2012-03-28 6 views
5

Sto cercando di sfruttare hadoop per addestrare più modelli. I miei dati sono abbastanza piccoli da stare nella memoria, quindi voglio avere un modello addestrato in tutte le attività della mappa.Hadoop: modo semplice di avere un oggetto come valore di output senza interfaccia scrivibile

Il mio problema è che quando ho finito di allenare il mio modello, ho bisogno di inviarlo al riduttore. Sto usando Weka per addestrare il modello. Non voglio iniziare a cercare come implementare l'interfaccia Writable nelle classi di Weka, perché richiede un grande sforzo. Sto cercando un modo semplice per farlo.

La classe Classifier in Weka implementa l'interfaccia Serializable. Come posso inviare questo oggetto al riduttore?

 edits 

Ecco il link che cita gli oggetti weka serializzazione: http://weka.wikispaces.com/Serialization

Ecco ciò che il mio codice è simile: Configurazione del lavoro (solo una parte della configurazione è pubblicato):

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

Mappa:

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

La mia classe Map estende Mapper (Oggetto, Testo, Testo, classificatore)

Ma sto ottenendo questo errore:

 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) 

quello che sto facendo di sbagliato ??

risposta

6

È possibile definire il proprio meccanismo di serializzazione

penso che risolve intorno implementando l'interfaccia di serializzazione, e definire l'implementazione nella proprietà di configurazione io.serializations

Nel tuo caso, se vuoi semplicemente usare java serial zione, impostare questa proprietà:

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

Ohh thanks..I controllerà fuori oggi e inviare ulteriori domande. – jojoba

+0

Ho apportato alcune modifiche poiché ho un problema. – jojoba

+0

Il testo sicuramente non implementa Serializable così hadoop non sa come gestire questo tipo - puoi usare sia la serializzazione Java che quella hadoop - imposta 'io.serializations' su' org.apache.hadoop.io.serializer.JavaSerialization , org.apache.hadoop.io.serializer.WritableSerialization' –

Problemi correlati