2012-08-27 47 views
4

(來自Hadoop新手)Hadoop Map-Reduce OutputFormat將結果分配給內存變量(不是文件)?

我想在玩具Hadoop概念驗證示例中儘可能避免使用文件。我能夠從非基於文件的輸入中讀取數據(感謝http://codedemigod.com/blog/?p=120) - 這會生成隨機數字。

我想將結果存儲在內存中,以便我可以對其進行進一步的(非Map-Reduce)業務邏輯處理。 Essetially:

conf.setOutputFormat(InMemoryOutputFormat) 
JobClient.runJob(conf); 
Map result = conf.getJob().getResult(); // ? 

似乎做我想做的是把結果保存在一個二進制文件輸出格式並重新讀取與等效輸入格式最接近的事。這似乎是不必要的代碼和不必要的計算(我誤解Map Reduce依賴的前提?)。

回答

7

這個想法的問題是Hadoop沒有「分佈式內存」的概念。如果你希望結果「在記憶中」,下一個問題必須是「哪臺機器的記憶?」如果你真的想這樣訪問它,你將不得不編寫自己的自定義輸出格式,然後也可以使用一些現有的框架來跨機器共享內存,或者再次編寫自己的內存。

我的建議是簡單地寫HDFS正常,然後非MapReduce的業務邏輯,只是通過文件系統API讀取來自HDFS數據開始,即:

FileSystem fs = new JobClient(conf).getFs(); 
Path outputPath = new Path("/foo/bar"); 
FSDataInputStream in = fs.open(outputPath); 
// read data and store in memory 
fs.delete(outputPath, true); 

當然,這做了一些不必要的磁盤讀寫操作,但是如果你的數據足夠小以適應內存,爲什麼你仍然擔心它呢?如果這是一個嚴重的瓶頸,我會很驚訝。

+0

這讓Joe很有意義。謝謝。如果有更多人有任何意見,我會在等待一段時間後將答案標記爲正確。 –