【问题标题】:Hadoop: Easy way to have object as output value without Writable interfaceHadoop:在没有可写接口的情况下将对象作为输出值的简单方法
【发布时间】: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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 哦,谢谢..我今天会检查一下并发布任何进一步的问题。
    • Text 肯定没有实现 Serializable 所以 hadoop 不知道如何处理这种类型 - 你可以同时使用 Java 和 hadoop 序列化 - 将 io.serializations 设置为 org.apache.hadoop.io.serializer.JavaSerialization,org.apache.hadoop.io.serializer.WritableSerialization
    • 这就是我所做的。请参阅我在配置部分中发布的代码。
    • sourcepod.com/uujpdz77-7029 。如果您检查了我发布的 weka 序列化链接,您会看到他们发布了用于将分类器保存为对象的源代码。所以序列化必须正常工作
    • Hadoop 不会写出存储在序列文件中的每个键值对的类型,它会存储您在 seq 文件顶部声明的类型。如果你想有多种类型的输出,你需要实现类似hadoop的GenericWritable,但是对于Serializable对象
    猜你喜欢
    • 2014-08-04
    • 2011-08-08
    • 2011-09-30
    • 2012-10-27
    • 2019-03-27
    • 1970-01-01
    • 1970-01-01
    • 2014-09-04
    • 1970-01-01
    相关资源
    最近更新 更多