找不到Hadoop Serializer异常

时间:2012-09-15 18:42:18

标签: serialization hadoop sequencefile

我的作业输出格式为SequenceFileOuputFormat

我像这样设置输出键和值类:

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

SplitInfoimplements 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)

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:3)

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

作为一般观察:OP中指定的错误具有潜在原因,HADOOP无法为您尝试序列化的特定类型(直接或间接地,例如通过使用该类型)找到序列化程序作为输出键/值)。由于以下两个原因之一,Hadoop无法找到Serilizer:

  1. 您的类型不可序列化(即它不实现Writable或Serializable)
  2. Hadoop没有可用于您的类型实现的序列化类型的序列化程序(例如:您的类型实现可写但由于某种原因而无法使用{0}}类

答案 1 :(得分:0)

我认为你正在尝试做一些你不需要的事情。您的输出值只需要实现Writable接口,您应该只设置输出格式。

conf.setOutputFormatClass(SequenceFileOutputFormat.class);

如果您想使用不同的序列化框架,则只使用“io.serializations”配置。它看起来不像您需要。