2014-02-05 47 views
1

是否可以將mapreduce作業的輸出拆分爲多個文件而不是單個'part-r-00000'文件?Splittig MapReduce輸出到多個輸出文件

我遇到了MultipleOutputFormat類,但從我讀過的內容看來,它只是將輸出分解爲基於鍵的文件。 MultipleOutputFormat

我在找的是以WordCount作業爲例,將輸出分成多個文件。

回答

1

原諒我,但通常你會得到儘可能多的part-r-nnnnn文件,因爲你有減速器任務。如果字數統計示例只配置了一個reducer,則您只需配置多個(mapred.reduce.tasks或Hadoop 2等效項)即可。

+0

謝謝。我意識到,我一直將reducer任務作爲默認值而沒有設置值,所以它一直是1。 – Koh

2

我對Wordcount有類似的問題。在我的情況下,我需要將每個字母開頭的單詞寫入單獨的文件中。在這裏我使用了MultipleOutputs

public class NameCountReducer extends Reducer<Text, NameCountTuple, Text, NameCountTuple> { 
private NameCountTuple result = null; 
private MultipleOutputs<Text,NameCountTuple> out; 

public void setup(Context context) { 
    out = new MultipleOutputs<Text,NameCountTuple>(context); 
} 
public void reduce(Text key, Iterable<NameCountTuple> values, Context context) 
     throws IOException, InterruptedException { 
    int count = 0; 
    for (HITuple val : values) { 

     count += val.getCount(); 
    } 
    result.setCount(count); 
    out.write(key, result,"outputpath/"+key.getText().charAt(0)); 
} 
public void cleanup(Context context) throws IOException,InterruptedException { 
    out.close();   
} 

}

這給出了以下路徑輸出

outputpath/a 
      /b 
      /c 
....... 

爲此,您應該使用LazyOutputFormat.setOutputFormatClass(),而不是FileOutputFormat。還需要添加作業配置爲job.setOutputFormatClass(NullOutputFormat.class)

+0

hi @TomSebastian。感謝您的幫助。實際上,我的MapReduce作業是一個簡單的搜索工作,因此它只運行沒有reduce任務的地圖任務,我只是希望它將所有搜索結果輸出到多個輸出文件。儘管如此,謝謝你的信息。可能會提供使用,因爲我繼續構建程序 – Koh

-1

謝謝大家對上述建議。

我所擁有的MapReduce作業實際上只是一個簡單的搜索任務,地圖任務會提取符合特定條件的輸入行。然後簡單地輸出結果而不需要通過任何減少任務。

最初我沒有設置減少任務數量,並從輸出日誌我可以看到它默認爲1.我試圖設置一個更高的數字,但它不會產生多個輸出文件(部分000xx),但只有其中一個輸出文件將包含所有結果,而其餘的只是空文件。

然後,當我在下面設置它,它的工作。每個減少任務輸出都是最終的輸出文件。我真的不知道這是做了正確的方式,但我會把它現在作爲一種解決方法

conf.set(「mapred.reduce.tasks」,「0」)