2012-03-28 5 views
5

複数のモデルを学習するためにhadoopを利用しようとしています。私のデータはメモリに収まるほど小さいので、すべてのマップタスクで1つのモデルを訓練したいと思っています。Hadoop:書き込み可能なインターフェイスなしでオブジェクトを出力値として持つ簡単な方法

私の問題は、私がモデルを訓練し終えたら、それを減速機に送る必要があるということです。私はWekaを使ってモデルを訓練しています。私は、WekaクラスでWritableインターフェイスを実装する方法を探し始めたいと思っていません。なぜなら、多くの努力が必要だからです。私はこれを行う簡単な方法を探しています。

WekaのClassifierクラスは、Serializableインターフェイスを実装しています。このオブジェクトをレデューサーに送るにはどうしたらいいですか?ここで

 edits 

はWEKAはシリアライズオブジェクト言及リンクである:(コンフィギュレーションの一部のみが掲載された)は、ジョブの設定 :

 conf.set("io.serializations","org.apache.hadoop.io.serializer.JavaSerialization," + "org.apache.hadoop.io.serializer.WritableSerialization"); 
     job.setOutputKeyClass(Text.class); 
     job.setOutputValueClass(Classifier.class); 
ここ http://weka.wikispaces.com/Serialization

は私のコードは次のようになります

地図機能:

 //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

+0

問題があるので編集しました。 – jojoba

+0

テキストは確かにSerializableを実装していないので、hadoopはこの型の扱い方を知らないので、Javaとhadoopの直列化を一緒に使うことができます - 'io.serializations'を' org.apache.hadoop.io.serializer.JavaSerialization 、org.apache.hadoop.io.serializer.WritableSerialization' –

関連する問題