Google MapReduce到底解決什麽問題?
很多時候,定義清楚問題比解決問題更難。
什麽是MapReduce?
它不是一個產品,而是一種解決問題的思路,它有多個工程實現,Google在論文中也給出了它自己的工程架構實現。
MapReduce這個編程模型解決什麽問題?
能夠用分治法解決的問題,例如:
-
網頁抓取
-
日誌處理
-
索引倒排
-
查詢請求匯總
-
…
畫外音:能夠發現,現實中有許多基於分治的應用需求。
為什麽是Google,發明了這個模型?
Google網頁抓取,分析,倒排的多個應用場景,當時的技術體系,解決不了Google大數據量高並發量的需求,Google被迫進行技術創新,思考出了這個模型。
畫外音:誰痛誰想辦法。
為什麽MapReduce對“能夠用分治法解決的問題”特別有效?
分治法,是將一個大規模的問題,分解成多個小規模的問題(分),多個小規模問題解決,再統籌小問題的解(合),就能夠解決大規模的問題。
分治法詳見《分治法與減治法》
Google MapReduce為什麽能夠成功?
Google為了方便用戶使用系統,提供給了用戶很少的接口,去解決復雜的問題。
(1) Map函數接口:處理一個基於key/value(後簡稱kv)的成對(pair)數據集合,同時也輸出基於kv的數據集合;
(2) Reduce函數接口:用來合並Map輸出的kv數據集合;
畫外音:MapReduce系統架構,能在大規模普通PC集群上實現並行處理,和GFS等典型的互聯網架構類似。
用戶僅僅關註少量接口,不用關心並行、容錯、數據分布、負載均衡等細節,又能夠解決很多實際的問題,還有這等好事!
能不能舉一個例子,說明下MapReduce的Map函數與Reduce函數是如何解決實際問題的?
舉例:假設要統計大量文檔中單詞出現的個數。
Map
輸入KV:pair(文檔名稱,文檔內容)
輸出KV:pair(單詞,1)
畫外音:一個單詞出現一次,就輸出一個1。
Reduce
輸入KV:pair(單詞,1)
輸入KV:pair(單詞,總計數)
以下是一段偽代碼,
foreach(pair in list)
foreach($word in $doc_content)
echo pair($word, 1); // 輸出list<k,v>
}
畫外音:如果有多個Map進程,輸入可以是一個pair,不是一個list。
Reduce(list<pair($word, $count)>){// 大量(單詞,1)
map<string,int> result;
foreach(pair in list)
result[$word] += $count;
foreach($keyin result)
echo pair($key, result[$key]); // 輸出list<k,v>
}
畫外音:即使有多個Reduce進程,輸入也是list<pair>,因為它的輸入是Map的輸出。
最早在單機的體系下計算,輸入數據量巨大的時候,處理很慢。如何能夠在短時間內完成處理,很容易想到的思路是,將這些計算分布在成百上千的主機上,但此時,會遇到各種復雜的問題,例如:
-
並行計算
-
數據分發
-
錯誤處理
-
集群通訊
-
…
這些綜合到一起,就成為了一個困難的問題,這也是Google MapReduce工程架構要解決的問題
Google MapReduce到底解決什麽問題?