2015-12-27 21 views
0

當我試圖用組合在我的MR工作我得到以下例外如何使用組合器,當減速器的輸出值爲空時?

顯示java.lang.NullPointerException
在 org.apache.hadoop.mapred.IFile $ Writer.append(IFile.java :193)
在 org.apache.hadoop.mapred.Task $ CombineOutputCollector.collect(Task.java:1315)

在 org.apache.hadoop.mapred.Task $ NewCombinerRunner $ OutputConverter.write(任務.java:1632)

原因是,我正在使用null作爲我在Reducer類中的輸出VALUE。 減速器代號:

public static class reducer extends Reducer<Text,IntWritable,Text,IntWritable>{ 
      public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException{ 
       context.write(key, null); 
      } 
    } 

當我刪除組合器類job.setCombinerClass(reducer.class);工作正在取得成功。

如何實現組合器,我需要相同的減速器輸出,即只有KEY作爲輸出?

+0

爲什麼不使用可選的Java或空對象?或者在減速器代碼中檢查空值。 – SMA

+0

我不確定你爲什麼是'null',你是否考慮使用'NullWritable'。 – YoungHobbit

+0

@YoungHobbit,我試過NullWritable,但是我面對同樣的錯誤。只是爲了測試我嘗試**新的IntWritable()**,那麼沒有問題。但是輸出結果並不如預期,最後加上0。 – Abhinay

回答

1

這是不可能實現的。問題是在IFile.java下面這段代碼:

public void append(K key, V value) throws IOException { 
    ..... 

    if (value.getClass() != valueClass) 
     throw new IOException("wrong value class: "+ value.getClass() 
          +" is not "+ valueClass); 

    ..... 

append()功能,有一個檢查:

if (value.getClass() != valueClass) 

既然你是路過null的值時,NullPointerException被拋出,當它試圖getClass()null值:

value.getClass() 

所以,即使如果y ou使用NullWritable(這又是一個班級)並通過null,您仍將獲得NullPointerException

而不是通過null,你應該通過傳遞0(零)來管理。

相關問題