Google MapReduce到底解决什么问题?
第二篇,Google MapReduce架構(gòu)啟示(上)。
很多時(shí)候,定義清楚問(wèn)題比解決問(wèn)題更難。
?
什么是MapReduce?
它不是一個(gè)產(chǎn)品,而是一種解決問(wèn)題的思路,它有多個(gè)工程實(shí)現(xiàn),Google在論文中也給出了它自己的工程架構(gòu)實(shí)現(xiàn)。
?
MapReduce這個(gè)編程模型解決什么問(wèn)題?
能夠用分治法解決的問(wèn)題,例如:
-
網(wǎng)頁(yè)抓取
-
日志處理
-
索引倒排
-
查詢(xún)請(qǐng)求匯總
-
…
畫(huà)外音:能夠發(fā)現(xiàn),現(xiàn)實(shí)中有許多基于分治的應(yīng)用需求。
?
為什么是Google,發(fā)明了這個(gè)模型?
Google網(wǎng)頁(yè)抓取,分析,倒排的多個(gè)應(yīng)用場(chǎng)景,當(dāng)時(shí)的技術(shù)體系,解決不了Google大數(shù)據(jù)量高并發(fā)量的需求,Google被迫進(jìn)行技術(shù)創(chuàng)新,思考出了這個(gè)模型。
畫(huà)外音:誰(shuí)痛誰(shuí)想辦法。
?
為什么MapReduce對(duì)“能夠用分治法解決的問(wèn)題”特別有效?
分治法,是將一個(gè)大規(guī)模的問(wèn)題,分解成多個(gè)小規(guī)模的問(wèn)題(分),多個(gè)小規(guī)模問(wèn)題解決,再統(tǒng)籌小問(wèn)題的解(合),就能夠解決大規(guī)模的問(wèn)題。
畫(huà)外音:分治法詳見(jiàn)《分治法與減治法》。
?
Google MapReduce為什么能夠成功?
Google為了方便用戶(hù)使用系統(tǒng),提供給了用戶(hù)很少的接口,去解決復(fù)雜的問(wèn)題。
(1)?Map函數(shù)接口:處理一個(gè)基于key/value(后簡(jiǎn)稱(chēng)kv)的成對(duì)(pair)數(shù)據(jù)集合,同時(shí)也輸出基于kv的數(shù)據(jù)集合;
(2)?Reduce函數(shù)接口:用來(lái)合并Map輸出的kv數(shù)據(jù)集合;
畫(huà)外音:MapReduce系統(tǒng)架構(gòu),能在大規(guī)模普通PC集群上實(shí)現(xiàn)并行處理,和GFS等典型的互聯(lián)網(wǎng)架構(gòu)類(lèi)似。
用戶(hù)僅僅關(guān)注少量接口,不用關(guān)心并行、容錯(cuò)、數(shù)據(jù)分布、負(fù)載均衡等細(xì)節(jié),又能夠解決很多實(shí)際的問(wèn)題,還有這等好事!
?
能不能舉一個(gè)例子,說(shuō)明下MapReduce的Map函數(shù)與Reduce函數(shù)是如何解決實(shí)際問(wèn)題的?
?
舉例:假設(shè)要統(tǒng)計(jì)大量文檔中單詞出現(xiàn)的個(gè)數(shù)。
?
Map
輸入KV:pair(文檔名稱(chēng),文檔內(nèi)容)
輸出KV:pair(單詞,1)
畫(huà)外音:一個(gè)單詞出現(xiàn)一次,就輸出一個(gè)1。
?
Reduce
輸入KV:pair(單詞,1)
輸入KV:pair(單詞,總計(jì)數(shù))
?
以下是一段偽代碼,
Map(list<pair($doc_name, $doc_content)>){
? ? foreach(pair in list)
? ? ? ? foreach($word in $doc_content)
? ? ? ? ? ? echo pair($word, 1); // 輸出list<k,v>
}
畫(huà)外音:如果有多個(gè)Map進(jìn)程,輸入可以是一個(gè)pair,不是一個(gè)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>
}
畫(huà)外音:即使有多個(gè)Reduce進(jìn)程,輸入也是list<pair>,因?yàn)樗妮斎胧荕ap的輸出。
?
最早在單機(jī)的體系下計(jì)算,輸入數(shù)據(jù)量巨大的時(shí)候,處理很慢。如何能夠在短時(shí)間內(nèi)完成處理,很容易想到的思路是,將這些計(jì)算分布在成百上千的主機(jī)上,但此時(shí),會(huì)遇到各種復(fù)雜的問(wèn)題,例如:
-
并行計(jì)算
-
數(shù)據(jù)分發(fā)
-
錯(cuò)誤處理
-
集群通訊
-
…
這些綜合到一起,就成為了一個(gè)困難的問(wèn)題,這也是Google MapReduce工程架構(gòu)要解決的問(wèn)題,也就是下一章將要分享的問(wèn)題,敬請(qǐng)期待。
總結(jié)
以上是生活随笔為你收集整理的Google MapReduce到底解决什么问题?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: GFS架构启示 | Google Fil
- 下一篇: Google MapReduce有啥巧妙