在我的map-reduce作業中,我使用4個reducer來實現reducer作業。所以通過這樣做,最終的輸出將生成4個部分文件:part-0000 part-0001 part-0002 part-0003多個reducer如何在Hadoop中只輸出一個部分文件?
我的問題是如何將hadoop的配置設置爲僅輸出一個零件文件,儘管hadoop使用4個reducer來工作?
在我的map-reduce作業中,我使用4個reducer來實現reducer作業。所以通過這樣做,最終的輸出將生成4個部分文件:part-0000 part-0001 part-0002 part-0003多個reducer如何在Hadoop中只輸出一個部分文件?
我的問題是如何將hadoop的配置設置爲僅輸出一個零件文件,儘管hadoop使用4個reducer來工作?
這不是從hadoop預期的行爲。但你可以在這裏使用MultipleOutputs
。 創建一個命名輸出,並在所有縮減器中使用該輸出,以獲得一個文件本身的最終輸出。它的Javadoc本身建議如下:
JobConf conf = new JobConf();
conf.setInputPath(inDir);
FileOutputFormat.setOutputPath(conf, outDir);
conf.setMapperClass(MOMap.class);
conf.setReducerClass(MOReduce.class);
...
// Defines additional single text based output 'text' for the job
MultipleOutputs.addNamedOutput(conf, "text", TextOutputFormat.class,
LongWritable.class, Text.class);;
...
JobClient jc = new JobClient();
RunningJob job = jc.submitJob(conf);
...
作業配置的使用模式是:
public class MOReduce implements
Reducer<WritableComparable, Writable> {
private MultipleOutputs mos;
public void configure(JobConf conf) {
...
mos = new MultipleOutputs(conf);
}
public void reduce(WritableComparable key, Iterator<Writable> values,
OutputCollector output, Reporter reporter)
throws IOException {
...
mos.getCollector("text", reporter).collect(key, new Text("Hello"));
...
}
public void close() throws IOException {
mos.close();
...
}
}
如果您正在使用新的API mapreduce
然後看到here。
MultipleOutputs.addNamedOutput(conf, "text", TextOutputFormat.class,
LongWritable.class, Text.class);
這裏是text
是輸出目錄還是單個大文件名爲text
?
我明白了!而且我知道不建議多個減速器只輸出一個文件。謝謝@Amar – JoJo 2013-03-12 21:09:18
@ user2052141不客氣。如果你覺得它有用,你應該提高答案。 :) – Amar 2013-03-13 09:52:45