2012-12-01 55 views
0

我想爲字計數實現hadoop reducer。 在我的reducer中,我使用散列表來計算單詞。但是,如果我的文件非常大,散列表將使用極端數量的內存。如何解決此問題? (例如,一個包含1000萬行每個reducer的文件接收1億個單詞,他如何計算散列表需要1億個密鑰的單詞) 我目前的實現是使用python。 有沒有一種智能的方法來減少內存的數量?針對大文件的高效Hadoop字計數

+0

我錯過了什麼嗎?但是如果你只是在計算單詞數量,你不需要一個長達100米的哈希表,因爲你會得到很多重複。例如,你可能會得到250k的單詞「the」。難道你不能通過一個增加'collections.Counter'的函數逐行傳輸數據嗎? – kreativitea

+0

對不起我的錯誤我想說的是,對於1000萬個不同的單詞,例如我需要一個散列表中的1000萬個條目 – nikosdi

+3

1億個不同的單詞,真的嗎? http://oxforddictionaries.com/words/how-many-words-are-there-in-the-english-language –

回答

0

要做到這一點,最有效的方法是在映射器中維護詞頻的哈希映射,並在達到特定大小(例如100,000條目)時將其刷新到輸出上下文。然後清除地圖並繼續(記住要在清理方法中刷新地圖)。

如果您仍然真的擁有數百萬字,那麼您需要等待很長時間才能完成縮減程序,或者增加羣集大小並使用更多的縮減程序。

+0

好吧,我正在使用一個組合器在映射器的那一刻。但我仍然有這個問題,因爲如果我的減速器收到更多的獨特的話,可以適應內存它不會繼續......好吧,我明白了!這是購買更大的Haddop集羣的答案的一部分! ;) – nikosdi

+1

當你到達reducer的時候,你不需要把所有內容都放在內存中 - 當然你只需要將每個鍵和輸出的計數加起來。你需要在reducer中維護一個hashmap嗎? –

+0

減速器可以接收來自映射器A1和A2的字A,因此減速器也必須執行計數....... A1發送{N,100} A2發送{N,100} ... – nikosdi