我有一堂课:
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 或更可能与实现 Serializable 和 Writable 的 Class2 有关。
有任何想法吗 ?
更新:
我将问题本地化:问题是 Class1,现在,我已更改为仅实现 Writable(而不是 Serializable)。我还对其进行了更改,因为它不再包含对 Class2 的引用。我仍然得到同样的错误。如果我将 Class1 替换为另一个 Writable 实现作为输出值,它就可以工作!为什么 ??