Serialization 未找到Hadoop序列化程序异常

Serialization 未找到Hadoop序列化程序异常,serialization,hadoop,sequencefile,Serialization,Hadoop,Sequencefile,我有一个作业,其输出格式为SequenceFileOutFormat 我将输出键和值类设置为: conf.setOutputKeyClass(IntWritable.class); conf.setOutputValueClass(SplitInfo.class); SplitInfo类实现可序列化、可写的 我将io.serializations属性设置如下: conf.set("io.serializations","org.apache.hadoop.io.serializer.JavaS

我有一个作业,其输出格式为
SequenceFileOutFormat

我将输出键和值类设置为:

conf.setOutputKeyClass(IntWritable.class);
conf.setOutputValueClass(SplitInfo.class);
SplitInfo
实现可序列化、可写的

我将
io.serializations
属性设置如下:

conf.set("io.serializations","org.apache.hadoop.io.serializer.JavaSerialization," 
+ "org.apache.hadoop.io.serializer.WritableSerialization");
但是,在reducer端,我得到了这个错误,告诉我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)
at org.apache.hadoop.mapred.ReduceTask.runNewReducer(ReduceTask.java:638)
at org.apache.hadoop.mapred.ReduceTask.run(ReduceTask.java:417)
java.lang.NullPointerException
位于org.apache.hadoop.io.serializer.SerializationFactory.getSerializer(SerializationFactory.java:73)
位于org.apache.hadoop.io.SequenceFile$Writer.init(SequenceFile.java:961)
位于org.apache.hadoop.io.SequenceFile$Writer。(SequenceFile.java:892)
位于org.apache.hadoop.io.SequenceFile.createWriter(SequenceFile.java:393)
位于org.apache.hadoop.io.SequenceFile.createWriter(SequenceFile.java:354)
位于org.apache.hadoop.io.SequenceFile.createWriter(SequenceFile.java:476)
位于org.apache.hadoop.mapreduce.lib.output.SequenceFileOutputFormat.getRecordWriter(SequenceFileOutputFormat.java:61)
位于org.apache.hadoop.mapred.ReduceTask$NewTrackingRecordWriter。(ReduceTask.java:569)
位于org.apache.hadoop.mapred.ReduceTask.runNewReducer(ReduceTask.java:638)
位于org.apache.hadoop.mapred.ReduceTask.run(ReduceTask.java:417)

有人能帮忙吗?

我想你是想做一些你不需要做的事情。您的输出值只需要实现可写接口,您应该只设置输出格式

conf.setOutputFormatClass(SequenceFileOutputFormat.class);

如果您想使用不同的序列化框架,那么您只能使用“io.serializations”配置,而您似乎并不需要它。

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

一般来说,OP中指定的错误的根本原因是HADOOP找不到要序列化的特定类型的序列化程序(直接或间接,例如,通过将该类型用作输出键/值)。Hadoop找不到序列化程序,原因如下:

  • 您的类型不可序列化(即,它未实现可写或可序列化)
  • Hadoop没有可用于您的类型实现的序列化类型的序列化程序(例如:您的类型实现可写,但Hadoop出于某种原因无法使用
    org.apache.Hadoop.io.Serializer.WritableSerialization
    类)

  • 我还使用DefaultStringifier,它似乎需要io.serialization集。否则就不行了!对不起,我没听懂。将自定义可写值对象写入SequenceFileOutputFormat不需要任何与io.serializations相关的内容。为什么要使用DefaultStringifier?DefaultStringifier在conf文件中存储某些内容