Hadoop:没有可写接口的简单方法将对象作为输出值

时间:2012-03-28 18:33:53

标签: java serialization hadoop weka

我正在尝试利用hadoop来训练多个模型。我的数据足够小,可以放入内存中,因此我想在每个地图任务中训练一个模型。

我的问题是,当我完成模型训练后,我需要将它发送到减速器。我正在使用Weka来训练模型。我不想开始研究如何在Weka类中实现Writable接口,因为它需要付出很多努力。我正在寻找一种简单的方法来做到这一点。

Weka中的Classifier类实现了Serializable接口。如何将此对象发送到reducer?

        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);

我的Map类扩展了Mapper(对象,文本,文本,分类器)

但是我收到了这个错误:

     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)

我做错了什么?

1 个答案:

答案 0 :(得分:6)

您可以定义自己的序列化机制

我认为它解决了实现Serialization接口,并在io.serializations配置属性中定义您的实现

在您的情况下,如果您只想使用java序列化,请将此属性设置为:

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