Hadoop 序列化嵌套对象



我有一个类:

 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 会在化简器端抛出此错误:

 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)

我的直觉告诉我,这个问题与类 1 有关,或者更有可能与同时实现可序列化和可写的类 2 有关。

有什么想法吗?

更新:

我本地化了问题:问题是 Class1,现在,我已经更改为仅实现可写(而不是可序列化)。我还更改了它,因为它不再包含对 Class2 的引用。我仍然收到同样的错误。如果我用另一个可写实现替换 Class1 作为输出值,它可以工作!为什么??

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

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

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

最新更新