私はクラスを持っています:
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)
私の直感によると、問題はClass1に関連している、またはSerializableとWritableの両方を実装するClass2に関連している可能性が高いとのことです。
何か案は ?
アップデート:
問題をローカライズしました。問題はClass1ですが、これはWritableのみを実装するように変更されました(Serializableも実装されていません)。また、Class2への参照が含まれなくなったという意味で変更しました。それでも同じエラーが発生します。Class1を出力値として別の書き込み可能な実装に置き換えると、機能します。なぜ ??