2012-03-28 20 views
5

我試圖利用hadoop來訓練多個模型。我的數據足夠小以適應內存,所以我想在每個地圖任務中都有一個模型受過訓練。Hadoop:將對象作爲輸出值的簡單方法,無需可寫接口

我的問題是,當我完成了我的模型訓練後,我需要將它發送到減速器。我正在使用Weka來訓練模型。我不想開始尋找如何在Weka類中實現Writable接口,因爲它需要很多努力。我正在尋找一個簡單的方法來做到這一點。

Weka中的Classifier類實現了Serializable接口。我怎樣才能發送這個對象到減速器?

 edits 

這裏是提到WEKA對象序列化的鏈接:http://weka.wikispaces.com/Serialization

這裏是我的代碼如下所示:配置 工作(僅配置的一部分發布):

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

地圖功能:

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

我的地圖類擴展映射器(對象,文本,文本,分類)

但我得到這個錯誤:

 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) 

我在做什麼錯?

回答

6

您可以定義自己的序列化機制

我認爲它解決了圍繞實現序列化接口,並在io.serializations配置屬性定義您的實現

在你的情況下,如果你只是想使用java串行化,此屬性設置爲:

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

喔thanks..I將於今天檢查出來,併發布任何進一步的問題。 – jojoba 2012-03-29 01:44:34

+0

我做了一些編輯,因爲我有一個問題。 – jojoba 2012-03-29 12:32:25

+0

文本絕對不會實現Serializable,因此hadoop不知道如何處理這種類型 - 您可以同時使用Java和hadoop序列化 - 將'io.serializations'設置爲'org.apache.hadoop.io.serializer.JavaSerialization ,org.apache.hadoop.io.serializer.WritableSerialization' – 2012-03-29 13:18:30

相關問題