java - Hadoop 序列化嵌套对象

标签 java serialization hadoop writable

我有一个类:

 class Class1 implements Writable{
       int intField;
       double doubleField;
       Class2 refToClass2;

       public void readField(DataInput in){...}
       public void write(DataOutput out){...}


 class Class2 implements Serializable, Writable{
     ....
 }

当使用 Class1 作为输出值时,Hadoop 在 reducer 端抛出此错误:

 java.lang.NullPointerException
at org.apache.hadoop.io.serializer.SerializationFactory.getSerializer(SerializationFactory.java:73)
at org.apache.hadoop.io.SequenceFile$Writer.init(SequenceFile.java:961)
at org.apache.hadoop.io.SequenceFile$Writer.<init>(SequenceFile.java:892)
at org.apache.hadoop.io.SequenceFile.createWriter(SequenceFile.java:393)
at org.apache.hadoop.io.SequenceFile.createWriter(SequenceFile.java:354)
at org.apache.hadoop.io.SequenceFile.createWriter(SequenceFile.java:476)
at org.apache.hadoop.mapreduce.lib.output.SequenceFileOutputFormat.getRecordWriter(SequenceFileOutputFormat.java:61)
at org.apache.hadoop.mapred.ReduceTask$NewTrackingRecordWriter.<init>(ReduceTask.java:569)

我的直觉告诉我,问题与 Class1 有关,或者更可能与同时实现了 Serialized 和 Writable 的 Class2 有关。

有什么想法吗?

更新:

我定位了问题:问题是 Class1,现在我已更改为仅实现可写(也不是可序列化)。我还对其进行了更改,使其不再包含对 Class2 的引用。我仍然遇到同样的错误。如果我用另一个 Writable 实现替换 Class1 作为输出值,它就可以工作! 为什么??

最佳答案

问题是我犯了一个愚蠢的错误:我没有更新 jar。因此,基本上 Class1 没有在旧的(正在使用的)jar 中实现 Writable 接口(interface)。

作为一般观察:OP中指定的错误的根本原因是HADOOP无法找到您尝试序列化的特定类型的序列化器(直接或间接,例如通过使用该类型)作为输出键/值)。由于以下 2 个原因之一,Hadoop 无法找到 Serilizer:

  1. 您的类型不可序列化(即它未实现可写或可序列化)
  2. 对于您的类型实现的序列化类型,Hadoop 没有可用的序列化程序(例如:您的类型实现了 Writable,但 hadoop 由于某种原因无法使用 org.apache.hadoop.io.serializer.WritableSerialization 类)<

关于java - Hadoop 序列化嵌套对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12446631/

相关文章:

javascript - 如何将通用 JavaScript 对象序列化为 XML

java - SerialVersionUID 对于外部化类真的有意义吗?

http - 有没有办法序列化golang http请求对象并持久保存在数据库中

perl - 为什么我的 reducer 出现故障? (Hadoop)

java - Spring MVC 和 Hibernate 集成在 intellij 中给出异常

java - AttachNotSupportedException 由于 Attach API 中缺少 java_pid 文件

java - 将 .bat 文件重定向到 Java 文本区域

java - 将元素添加到 JList 时如何获取要在 JTextfield 中显示的整数值

hadoop - 使用flume根据消息中的属性重定向JMS消息

hadoop - 运行oozie时出错