2012-09-16 94 views
0

我有一个类: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{ 
    .... 
} 

的Hadoop抛出这个错误的减速装置,使用的Class1作为一个输出值时:

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或更可能实现Serializable和Writable的Class2相关。

任何想法?

UPDATE:

我本地化的问题:问题是其中的Class1,现在,我已经改变了只实现了可写(没有也可序列化)。我也改变了它,因为它不再包含对Class2的引用。我仍然得到同样的错误。如果我将Class1替换为另一个Writable实现作为输出值,则它可以工作! 为什么?

+0

你可以分享io.serializations'的'值的组态? –

+0

我想我已经达成了解决方案,我只需要检查它。我犯了一个愚蠢的错误。 – Razvan

回答

1

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

作为一般观察:在OP中指定的错误有一个基本原因,HADOOP无法找到串行化程序的一个特定类型,你试图序列化(直接或间接,例如通过使用键入作为输出键/值)。 Hadoop的找不到Serilizer为2个原因:

  1. 你的类型不是可序列化(即它没有实现可写或可序列化)
  2. 没有串行可供Hadoop的序列化的类型的式工具(如:你的类型实现了可写,但Hadoop的一个原因或其他原因不能使用org.apache.hadoop.io.serializer.WritableSerialization类)