2012-09-15 47 views
2

我有一個輸出格式爲SequenceFileOuputFormat的作業。未找到Hadoop串行器異常

我設置輸出鍵和值類是這樣的:

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"); 

然而,在減速器我得到這個錯誤,告訴我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) 

任何人都可以幫忙嗎?

回答

3

問題是我犯了一個愚蠢的錯誤:我沒有更新一個罐子。所以,基本上SplitInfo並沒有在舊的(使用中)jar中實現Writable接口。

作爲一般觀察:在OP中指定的錯誤有一個基本原因,HADOOP無法找到串行化程序的一個特定類型,你試圖序列化(直接或間接,例如通過使用鍵入作爲輸出鍵/值)。 Hadoop的找不到Serilizer爲2個原因:

  1. 你的類型不是可序列化(即它沒有實現可寫或可序列化)
  2. 沒有串行可供Hadoop的序列化的類型的類型的工具(例如:你的類型實現了Writable但hadoop由於某種原因或另一個不能使用org.apache.hadoop.io.serializer.WritableSerialization類)
0

我認爲你正在嘗試做一些你不需要的事情。你的輸出值只需要實現Writable接口,你應該設置輸出格式。

conf.setOutputFormatClass(SequenceFileOutputFormat.class); 

你只,如果你想使用一個不同的序列化框架,它看起來並不像你需要使用「io.serializations」配置。

+0

我也使用DefaultStringifier,這似乎需要io.serialization集。否則它不起作用! – Razvan

+0

對不起,我沒有關注。你不應該需要任何與io.serializations相關的東西來將自定義的Writable值對象寫入SequenceFileOutputFormat。你爲什麼使用DefaultStringifier? –

+0

DefaultStringifier將某些內容存儲在conf文件中 – Razvan