2013-10-01 10 views
3

我使用Hadoop來計算單詞之間的共現相似性。我有一個包含看起來像同現語對的文件:Hadoop:如何將Reduce的輸出收集爲Java HashMap

a b 
a c 
b c 
b d 

我使用的是基礎的方法是把詞作爲節點和共同出現的詞有他們之間的邊緣。我的算法需要計算所有節點的程度。我已經成功地寫了一個Map-Reduce工作來計算其輸出以下總額度:

a 2 
b 3 
c 2 
d 1 

目前,輸出回寫到文件,但我想要的卻是捕捉到的結果,說, java.util.HashMap。然後,我想在其他Reduce作業中使用此HashMap來計算最終相似度。

這裏是我的問題:

  1. 是否有可能捕獲內存減少的作業的結果(ListMap)。如果是這樣,怎麼樣?
  2. 這是最好的方法嗎?如果不是,我該如何處理?
+0

如果我理解正確,你需要第一份工作的輸入和第一份工作的輸出來運行第二份工作?無論是哪種情況,都應該可以簡單地級聯兩個工作。預計散列表有多大? (你可能會把它放到第二份工作的分佈式緩存中) – DDW

+0

你是對的!我需要第一份工作的輸入和第一份工作的輸出來運行第二份工作。 HashMap可能跨越數萬個條目。 – codemaniac

回答

1

有兩種可能性:或者您從分佈式文件系統讀取map/reduce任務中的數據。或者直接將其添加到分佈式緩存。我GOOGLE了分佈式緩存的大小,它可以控制的「該local.cache.size參數控制 DistributedCache的大小默認情況下,它被設置爲10 GB。」

Link to cloudera blog

所以,如果你的第一份工作的輸出增加了第二的分佈式緩存,你應該罰款,我認爲。成千上萬的條目遠遠不在千兆字節範圍內。

將文件添加到分佈式緩存去如下:

在你的映射器閱讀

Path[] uris = DistributedCache.getLocalCacheFiles(context.getConfiguration()); 
String patternsFile = uris[0].toString(); 
BufferedReader in = new BufferedReader(new FileReader(patternsFile)); 

添加到DBCache:

DistributedCache.addCacheFile(new URI(file), job.getConfiguration()); 

而設置你的第二份工作。

讓我知道這是否有竅門。

+0

如果這回答你的問題,請'接受作爲答案關閉' – DDW