2013-03-11 61 views
4

在我的map-reduce作業中,我使用4個reducer來實現reducer作業。所以通過這樣做,最終的輸出將生成4個部分文件:part-0000 part-0001 part-0002 part-0003多個reducer如何在Hadoop中只輸出一個部分文件?

我的問題是如何將hadoop的配置設置爲僅輸出一個零件文件,儘管hadoop使用4個reducer來工作?

回答

8

這不是從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

+0

我明白了!而且我知道不建議多個減速器只輸出一個文件。謝謝@Amar – JoJo 2013-03-12 21:09:18

+1

@ user2052141不客氣。如果你覺得它有用,你應該提高答案。 :) – Amar 2013-03-13 09:52:45

-1
MultipleOutputs.addNamedOutput(conf, "text", TextOutputFormat.class, 
LongWritable.class, Text.class); 

這裏是text是輸出目錄還是單個大文件名爲text

相關問題