我有一门课:
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有关,或者更可能与class2有关,后者实现了可序列化和可写。
有什么想法吗?
更新:
我对问题进行了本地化:问题是class1,现在,我将其改为只实现可写(不同时实现可序列化)。我也改变了它,因为它不再包含对class2的引用。我还是会犯同样的错误。如果我将class1替换为另一个可写实现作为输出值,它就可以工作了!为什么?
1条答案
按热度按时间vwkv1x7d1#
问题是我犯了一个愚蠢的错误:我没有更新jar。因此,class1基本上没有在旧的(正在使用的)jar中实现可写接口。
一般来说,op中指定的错误的根本原因是hadoop找不到要序列化的特定类型的序列化程序(直接或间接地,例如通过将该类型用作输出键/值)。hadoop找不到序列化程序,原因有两个:
您的类型不可序列化(即,它不实现可写或可序列化)
对于您的类型实现的序列化类型,hadoop没有可用的序列化程序(例如:您的类型实现可写,但hadoop出于某种原因无法使用org.apache.hadoop.io.serializer.writeableserialization类)