2013-03-19 48 views
1

我最近開始學習hadoop。現在,我想在本地磁盤中打開一個文件,並在reduce函數中將一些數據寫入該文件,但我無法找到關閉該文件的好方法。hadoop關閉文件寫在本地磁盤上

據我所知,關閉並重新打開它不是一個好主意,所以我不想這樣做。

public class MyClass extends Configured implements Tool{ 
    main(){ 
     //all configurations here 
     job.setMapperClass(MyMapper.class); 
     job.setReducerClass(MyReducer.class); 
    } 
    static class MyMapper extends Mapper <LongWritable,Text,Text,Text>{ 
     //does something 
    } 
    static class MyReducer extends Reducer <LongWritable,Text,Text,Text>{ 
     //create file, filewriter etc here 
     public MyReducer() { 
       //open a file here 
     } 
     public reduce(){ 
       //write to file here 
       bw.write("entered the reduce task for " + key); 
       while(there is more item) 
        bw.write(value + " will be written to my file \n"); 
     } 
    } 
} 

工作流程會是這樣(糾正我,如果我錯了):

for(each reduce task) 
    write to file "entered the reduce task for " + *key* 
     for each *value* for that *key* 
      write *value* 

我想寫鍵/值對,MYFILE寫在本地磁盤上,然後想關閉文件,但我找不到解決這個問題的好辦法。 或者如果我沒有關閉文件,我的意思是說,hadoop正在處理這個問題,這會是一個問題嗎?

感謝,

回答

1

都映射器,你就必須擴展之前,你的處理後的數據來運行代碼的方法減速機類。

  • 之前到地圖中運行代碼/減少運行,延長setup(Context context)方法
  • 後您的地圖運行代碼/ reduce任務已經完成,

因此延長cleanup(Context context)方法,你的情況您可以擴展close方法來關閉文件。 (你需要在reducer中維護一個實例變量到開放流)。

請注意,在您的reduce方法失敗/異常時,您的close方法將不會被調用(除非您重寫reduce方法本身來捕獲異常,運行close方法然後重新拋出異常)。