2

我有一份工作,其输出格式为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");

但是,在减速器方面,我收到此错误,告诉我 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)

有人可以帮忙吗?

4

2 回答 2

3

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

作为一般性观察:OP中指定的错误的根本原因是HADOOP无法找到您尝试序列化的特定类型的序列化程序(直接或间接,例如通过使用该类型作为输出核心价值)。由于以下两个原因之一,Hadoop 找不到 Serilizer:

  1. 您的类型不可序列化(即它不实现可写或可序列化)
  2. 对于您的类型实现的序列化类型,Hadoop 没有可用的序列化器(例如:您的类型实现 Writable 但 hadoop 出于某种原因无法使用org.apache.hadoop.io.serializer.WritableSerialization该类)
于 2012-09-16T18:39:18.683 回答
0

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

conf.setOutputFormatClass(SequenceFileOutputFormat.class);

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

于 2012-09-16T04:29:08.283 回答