【发布时间】:2012-03-28 18:33:52
【问题描述】:
我正在尝试利用 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);
我的 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)
我做错了什么??
【问题讨论】:
标签: java serialization hadoop weka