2013-02-28 46 views
0

我有1 TB未排序的字數(字:count),我想運行一個map reduce作業來選擇最大字數的單詞。在這種情況下,我希望有一個變量可以在所有縮減作業之間共享,這些作業將保持目前字數最多的單詞。 reduce函數只會檢查這個變量並在必要時更新它。那可能嗎?謝謝如何在hadoop中的所有減少作業之間共享變量

+0

看看這個答案是否有幫助:http://stackoverflow.com/questions/15048013/sharing-data-between-master-and-reduce/15073701#15073701 – Amar 2013-03-01 19:09:28

回答

2

我認爲你誤解了Mapreduce的工作原理。它恰恰不會在機器之間共享內存以提高吞吐量,儘管您受限於Mapreduce模型的機制。

爲了做到你說的話,你會做以下幾點:

Map : (word, count) -> (KEY_CONSTANT, (count, word)) 

而且

Combine/Reduce : (key, List<(count, word)>) -> (key, (count*, word*) with max count) 

如果添加count的關鍵,但要確保一切都還在一個分區,您可以告訴MapReduce按降序對count進行排序,然後您可以實現一個單獨的簡化器,它只檢查每個列表中的第一個值。但是,您無法對組合器執行此操作,其輸入未分類。因爲它不會讀取其餘的數據,所以可能會讓實現更快。

有關如何有效地使用排序階段的詳細信息,請參閱How does MapReduce framework implement the sort phase?

過程的概述:http://wiki.apache.org/hadoop/HadoopMapReduce

2

你可以

  • 設置減速機的數量爲1
  • 將兩個實例變量添加到reducer類中,一個用於計數,另一個用於單詞,以保存關於最頻繁的詞的形成呢。
  • 將reduce()方法中的reduce setup()方法
  • 中的變量初始化爲reduce()方法,檢查當前單詞是否出現的次數多於最常出現的次數,如果是,則將單詞和計數存入變量
  • 在清理()方法,你可以訪問的變量有最常說的一句話

如果需要運行多個減速,然後修改減速的清理()方法,而不是寫出來的字並將其作爲關鍵值對計算在上下文中。類似於上述原始減速器的後續減速器可以輕鬆找到出現次數最多的單詞。