未找到hadoop序列化程序异常

yebdmbv4  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(342)

我有一份工作,它的输出格式是 SequenceFileOuputFormat .
我将输出键和值类设置为:

conf.setOutputKeyClass(IntWritable.class);
conf.setOutputValueClass(SplitInfo.class);

这个 SplitInfo 班级 implements Serializable,Writable 我设置了 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)

有人能帮忙吗?

kg7wmglp

kg7wmglp1#

我觉得你在做一些你不需要做的事。您的输出值只需要实现可写接口,您只需设置输出格式。

conf.setOutputFormatClass(SequenceFileOutputFormat.class);

如果您想使用一个不同的序列化框架,那么您只能使用“io.serializations”配置,而这看起来并不是您所需要的。

lhcgjxsq

lhcgjxsq2#

问题是我犯了一个愚蠢的错误:我没有更新jar。因此,基本上splitinfo并没有在旧的(正在使用的)jar中实现可写接口。
一般来说,op中指定的错误的根本原因是hadoop找不到要序列化的特定类型的序列化程序(直接或间接地,例如通过将该类型用作输出键/值)。hadoop找不到序列化程序,原因有两个:
您的类型不可序列化(即,它不实现可写或可序列化)
对于您的类型实现的序列化类型,hadoop没有可用的序列化程序(例如:您的类型实现可写,但hadoop出于某种原因无法使用 org.apache.hadoop.io.serializer.WritableSerialization 类)

相关问题