2013-10-04 87 views
0

我有一個Mapper類提供了一個文本鍵和IntWritable值,它可以是1或2或3。取決於我必須用不同的keys寫三個不同的文件的值。我得到一個沒有記錄的單個文件輸出。 另外,有什麼好的MultipleOutputs例子(與解釋),你可以指導我?爲什麼MultipleOutputs不適用於此Map Reduce程序?

我的驅動類有此代碼: MultipleOutputs.addNamedOutput(job,「name」,TextOutputFormat.class,Text.class,IntWritable.class); MultipleOutputs.addNamedOutput(job,「attributes」,TextOutputFormat.class,Text.class,IntWritable.class); MultipleOutputs.addNamedOutput(job,「others」,TextOutputFormat.class,Text.class,IntWritable.class);

我減速機類: 公共靜態類減少擴展減速{

private MultipleOutputs mos; 
public void setup(Context context) { 
      mos = new MultipleOutputs(context); 
     } 
    public void reduce(Text key, Iterable<IntWritable> values, Context context) 
    throws IOException, InterruptedException { 
     int sum = 0; 
    String CheckKey = values.toString(); 
    if("1".equals(CheckKey)) { 
    mos.write("name", key, new IntWritable(1)); 
    } 
    else if("2".equals(CheckKey)) { 
    mos.write("attributes", key, new IntWritable(2)); 
    } 
    else if("3".equals(CheckKey)) { 
    mos.write("others", key,new IntWritable(3)); 
    } 


     /* for (IntWritable val : values) { 
      sum += val.get(); 
     }*/ 
     //context.write(key, null); 
    } 
    @Override 
public void cleanup(Context context) throws IOException, InterruptedException { 
mos.close(); 
} 
} 

P.S我是新來HADOOP/MAP-減少編程。

+0

第一個隨機問題:你完全確定mos.write被調用?values.toString()看起來可疑嗎? – DDW

+0

我不這麼認爲:減少輸入記錄= 30 13/10/04 12:46:52信息mapred.JobClient:減少輸入組= 3 13/10/04 12:46:52信息mapred.JobClient:組合輸出記錄= 0 13/10/04 12:46:52信息mapred.JobClient:物理內存(字節)快照= 230494208 13/10/04 12:46:52信息mapred.JobClient:減少輸出記錄= 0 13/10/04 12:46:52信息mapred。JobClient:虛擬內存(字節)快照= 700944384 13/10/04 12:46:52信息mapred.JobClient:地圖輸出記錄= 30 – David

+0

這是我得到的日誌。輸出記錄爲零,儘管reducer可以獲得3條記錄。還有什麼好的MultipleOutputs例子可以幫助我? – David

回答

2
ArrayList<Integer> l = new ArrayList<Integer>(); 
l.add(1); 
System.out.println(l.toString()); 

結果「[1]」不是1所以

values.toString() 

不會放棄「1」

除此之外,我只是試圖打印可迭代,它只是給一個參考,所以這絕對是你的問題。如果你想迭代的值如下例所示:

Iterator<Text> valueIterator = values.iterator(); 
while (valueIterator.hasNext()){ 

} 

請注意,你只能迭代一次!

+0

出於好奇:你的問題解決了嗎? – DDW

0

你的問題陳述是混亂的。你是什​​麼意思,「取決於價值」? Reducer獲得一個可重複的值,而不是一個單一的值。有些東西告訴我,你需要將你的減速器中的多個輸出代碼移到你已經註釋掉的循環中。

或者你可能根本不需要減速器,可以在地圖階段處理這個問題。如果您正在使用reduce階段通過使用單個reduce任務完成4個文件,那麼您也可以通過在map階段中翻轉鍵和值並完全忽略MultipleOutput來達到目的,因爲您會結束只有3個正在運行的reduce任務,每個int值都有一個。要獲得第四個地圖,您可以使用特殊鍵在每個地圖調用中輸出記錄的兩個副本,以指示輸出適用於普通文件,而不是三個特殊文件中的一個。通常情況下,我不會推薦這樣一種行爲,因爲當密鑰數量很小時,在縮減階段可以達到的並行性水平有嚴格的限制。

如果您遇到的值不是您期望的三值之一,那麼您還應該在「if」階梯的末尾添加一些反常的數據處理代碼,以增加計數器的值。

相關問題