若是想統計下過去 50 年畢業生畢業論文出現最多的幾個單詞,看看你們都在研 究些什麼,那收集好論文後,該怎麼辦呢?
方法一:我能夠寫一個小程序,把全部論文按順序遍歷一遍,統計每個遇到的單 詞的出現次數,最後就能夠知道哪幾個單詞最熱門了。
這種方法在數據集比較小時,是很是有效的,並且實現最簡單,用來解決這個問題 很合適。
方法二:寫一個多線程程序,併發遍歷論文。
方法二確定比方法一高效。可是寫一個多線程程序要比方法一困難多了,咱們必須 本身同步共享數據,好比要防止兩個線程重複統計文件。
方法三:把做業交給多個計算機去完成。
咱們可使用方法一的程序,部署到 N 臺機器上去,而後把論文集分紅 N 份,一臺 機器跑一個做業。這個方法跑得足夠快,可是部署起來很麻煩,咱們要人工把程序 copy 到別的機器,要人工把論文集分開,最痛苦的是還要把 N 個運行結果進行整合 (固然咱們也能夠再寫一個程序)。
方法四:讓 MapReduce 來幫幫咱們吧!
MapReduce 本質上就是方法三,可是如何拆分文件集,如何 copy 程序,如何整 合結果這些都是框架定義好的。咱們只要定義好這個任務(用戶程序),其它都交 給 MapReduce 。
map 函數和 reduce 函數
map 函數和 reduce 函數是交給用戶實現的,這兩個函數定義了任務自己。
map 函數:接受一個鍵值對( key-value pair ),產生一組中間鍵值對。MapReduce 框架會將 map 函數產生的中間鍵值對裏鍵相同的值傳遞給一個reduce 函數。
reduce 函數:接受一個鍵,以及相關的一組值,將這組值進行合併產生一組規模 更小的值(一般只有一個或零個值)。