是否可以將mapreduce作業的輸出拆分爲多個文件而不是單個'part-r-00000'文件?Splittig MapReduce輸出到多個輸出文件
我遇到了MultipleOutputFormat類,但從我讀過的內容看來,它只是將輸出分解爲基於鍵的文件。 MultipleOutputFormat
我在找的是以WordCount作業爲例,將輸出分成多個文件。
是否可以將mapreduce作業的輸出拆分爲多個文件而不是單個'part-r-00000'文件?Splittig MapReduce輸出到多個輸出文件
我遇到了MultipleOutputFormat類,但從我讀過的內容看來,它只是將輸出分解爲基於鍵的文件。 MultipleOutputFormat
我在找的是以WordCount作業爲例,將輸出分成多個文件。
原諒我,但通常你會得到儘可能多的part-r-nnnnn文件,因爲你有減速器任務。如果字數統計示例只配置了一個reducer,則您只需配置多個(mapred.reduce.tasks或Hadoop 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)
hi @TomSebastian。感謝您的幫助。實際上,我的MapReduce作業是一個簡單的搜索工作,因此它只運行沒有reduce任務的地圖任務,我只是希望它將所有搜索結果輸出到多個輸出文件。儘管如此,謝謝你的信息。可能會提供使用,因爲我繼續構建程序 – Koh
謝謝大家對上述建議。
我所擁有的MapReduce作業實際上只是一個簡單的搜索任務,地圖任務會提取符合特定條件的輸入行。然後簡單地輸出結果而不需要通過任何減少任務。
最初我沒有設置減少任務數量,並從輸出日誌我可以看到它默認爲1.我試圖設置一個更高的數字,但它不會產生多個輸出文件(部分000xx),但只有其中一個輸出文件將包含所有結果,而其餘的只是空文件。
然後,當我在下面設置它,它的工作。每個減少任務輸出都是最終的輸出文件。我真的不知道這是做了正確的方式,但我會把它現在作爲一種解決方法
conf.set(「mapred.reduce.tasks」,「0」)
謝謝。我意識到,我一直將reducer任務作爲默認值而沒有設置值,所以它一直是1。 – Koh