2015-08-15 35 views
1

我使用Hadoop 2.6.0的Apache分發版。我知道映射器的輸出文件以每個映射器的格式'part-m-xxxxx'命名,reducer的輸出文件命名爲'part-r-xxxxx'。我正在試驗一個簡單的Max-Temperature用例,並且我沒有在Job配置中設置任何Reducer類。既然如此,是不是應該命名爲「part-m-xxxxx」的輸出文件?請找我下面主要類:爲什麼我的輸出文件名爲'part-r-xxxxx',即使我沒有提到任何reducer類?

public class MaxTemperature{ 

    public static void main(String[] args) throws Exception 
    { 
     Configuration conf = new Configuration(); 
     Job job = new Job(conf, "Max Temperture"); 
     job.setJarByClass(MaxTemperature.class); 
     int noOfInputPaths = args.length-1; 
     for (int i=0; i<noOfInputPaths; i++){ 
      System.out.println("Adding Input path: "+args[i]); 
      FileInputFormat.addInputPath(job, new Path(args[i])); 
     } 
     System.out.println("Output path: "+args[args.length - 1]); 
     FileOutputFormat.setOutputPath(job, new Path(args[args.length - 1])); 

     job.setMapperClass(MaxTemperatureMapper.class); 
     //job.setReducerClass(MaxTemperatureReducer.class); 
     //job.setNumReduceTasks(3); 

     job.setOutputKeyClass(Text.class); 
     job.setOutputValueClass(IntWritable.class);  

     job.setMapOutputKeyClass(Text.class); 
     job.setMapOutputValueClass(IntWritable.class); 

     System.exit(job.waitForCompletion(true)? 0 : 1); 
    } 
} 

回答

1

如果MapReduce程序員不使用job.setReducerClass設置Reducer類,那麼將使用IdentityReducer.class作爲默認值。 如果您只想對輸入進行排序。例如,可以使用身份縮減器來實現令人尷尬的並行算法,您只需使用映射器來執行並行任務,但您希望對輸出鍵值對進行排序。輸出將是部分-r-xxxxx。

,如果你在這種情況下設置

job.setNumReduceTasks(0); 

沒有減速運行和程序的輸出將命名爲部分M-XXXXX。輸出將不會被排序。

1

默認的Hadoop OUTPUTFORMAT正在使用,它將初始化和創建文件名爲(部分-R-XXXXX),並同你的輸出文件夾下看到。現在

,創建的文件(S)是空的,因爲你不是在減速部分寫入(context.write(...))。但是這並不能阻止它們在初始化期間被創建文件。

要停止這一點,你需要定義輸出格式的說,你不希望任何輸出。請參閱下文。

myJob.setOutputFormat(NullOutputFormat.class); 

通過上述屬性設置,可以確保您的零件文件根本不會被初始化。

注意:您可以使用LazyOutputFormat這將確保您的輸出文件只創建,如果有一些數據,並不會初始化空文件。見下文。

LazyOutputFormat.setOutputFormatClass(myJob, TextOutputFormat.class); 

希望這會有所幫助。

+0

設置OUTPUTFORMAT爲「NullOutputFormat.class」導致創建無輸出。我其實是想知道如何配置我的工作以這樣的方式,如果我的問題得到解決和相同的輸出提供使用映射器本身(比如,在我們都保證了方案的鑰匙將只一次作爲出現映射器輸入,那麼我猜這可能是可能的),那麼我們如何防止設置任何減速器任務並減少開銷。 –

+0

另外,目前所產生的部分-R-00000的文件是不是空的,它包含排序但是未結合的輸出(通常爲映射器輸出)。我想這會是因爲我的地圖方法中有一個context.write()。 –

相關問題