2013-07-16 58 views
0

我想將Reducer結果寫入普通文件(例如.csv或.log文件),而不是寫入HDFS。所以我用下面的代碼在減速機類:Hadoop將輸出寫入普通文件

@Override 
public void reduce(Text key, Iterable<LongWritable> values, Context context) throws IOException, InterruptedException { 

    // Standard algorithm for finding the max value 
    long sum = 0; 
    for (LongWritable value : values) { 
     sum++; 
    } 

    context.write(key, new LongWritable(sum)); 
    System.out.println(key + " : " + sum); 
    Main.map.put(key.toString(), sum); 
} 

我打印地圖的內容到主類csv文件。但是,減速機完成後,文件是空的。我發現地圖是空的,因爲在reducer類中它沒有放置任何東西到地圖中,我也看不到控制檯中reducer中的任何System.out.println(key +「:」+ sum)。

這怎麼可能?他們不是在減速機班處理?

+0

你到底想要完成什麼? – climbage

+0

例如我運行word count,hadoop jar word count.jar輸入輸出,除了將輸出寫入HDFS之外,我還想將結果寫入諸如result.log之類的日誌文件中,並且此result.log與輸出文件在HDFS – user2552010

回答

1

讓我們來看這個問題的根源。每個映射或減少任務都在其自己的Java虛擬機(JVM)中啓動。這些JVM不會彼此共享內存。

比方說,你有以下設置:

  • JVM-1:JobClient(這是你的主要驅動器類)
  • JVM-2:減速機的任務(這是JVM你減速機在運行)

這是發生了什麼:

  1. JVM-1發起地圖/減少作業
  2. JVM-2放入Main.map<K,V>
  3. 地圖的項目/減少作業完成。
  4. JVM-1,嘗試從Main.map<K,V>讀,但有什麼都沒有,因爲JVM-2在自己的內存寫信給一個地圖,JVM-1不會看到。

類似的事情發生在System.out。它實際上可能不會附加到stdout流。很可能(如果您有多節點設置),輸出將轉到網絡上的另一臺計算機。

+0

好的...如果它是這樣的,我該怎麼辦?我怎樣才能將reducer結果打印到文件中? – user2552010