谷歌 MapReduce 初探

谷歌“三駕馬車”的出現,才真正把我們帶入了大數據時代,畢竟沒有谷歌,就沒有大數據。

谷歌 MapReduce 初探

上次的分享《 》,我們對谷歌的其中一駕寶車 GFS 進行了管中窺豹,雖然只見得其中一斑,但是也能清楚的知道 GFS 能夠把大量廉價的普通機器,聚在一起,充分讓每臺廉價的機器發揮光和熱,不但降低了運營成本,而且解決了一個業界數據存儲的難題。

雖然 GFS 解決了 Google 海量數據的存儲的難題,但是隨之而來的就是“如何從海量數據中快速計算並得到結果的難題”,面對這個難題,誰痛誰想辦法,Google 再次進行技術創新,重磅推出另一篇論文《MapReduce: Simplified Data Processing on Large Clusters》,接下來就一起認識認識 MapReduce。

認識

到底是個啥?說白了,MapReduce 其實就是一個為了簡化海量數據處理而提出的編程模型。

主要思想:分而治之,將一個大規模的問題,分成多個小規模的問題,把多個小規模問題解決,然後再合併小規模問題的解,就能夠解決大規模的問題。

編程模型:

我們只需要通過編寫 Map 函數和 Reduce 函數來指定想要進行的計算,而不用花心思去糾結背後複雜的容錯、數據分發、負載均衡等等一系列技術細節問題。MapReduce 所執行的分佈式計算會以一組鍵值對作為輸入,輸出另一組鍵值對。

怎麼想的?原來是受 Lisp 以及其它一些函數式編程語言中的 map 和 reduce 原語影響而來的(如果你閒著無聊,再去了解 Lisp 也不遲)。

疑惑

百思要求解。說了這麼多,感覺還是一無所知,顯然是一塊硬骨頭,其實在腦海中早已蕩起千層疑問的波。

Map 函數是啥?Reduce 函數又是啥?

接下來我們一起慢慢去體會。

谷歌 MapReduce 初探

統計大量文檔中每一個單詞出現的次數,這也是大數據技術入門的經典案例“WordCount”,此時需要我們編寫類似上面的偽代碼。

簡單剖析這段偽代碼,希望對 Map、Reduce 函數有一個深入的認識。

剖析 1:要統計文檔每個單詞出現的次數,顧名思義 map 函數入參 key 是文件名,value 是文檔的內容,接下來逐個遍歷單詞,每遇到一個單詞 w,就輸出一箇中間結果(w, "1")。

剖析 2:reduce 函數入參 key 就是單詞 w,值是一串“1”,然後將這些“1”累加就得到單詞 w 的出現次數。

剖析 3:最後把文檔中單詞的出現次數,輸出到用戶定義的位置,例如存儲到分佈式存儲系統 GFS 上。

好了,大數據入門經典案例“WordCount”的偽代碼,到這就剖析個八九不離十,雖然懵懂了不少,但是還是萌生了一些猜想和疑問。

懵懂:

Map 函數是啥?Reduce 函數是啥?

Map函數:處理一個基於 key/value 鍵值對的數據集合,同時也輸出基於 key/value 的數據集合;

Reduce函數:用來合併 Map 函數輸出的 key/value 數據集合。

論文中說了,上面偽代碼中輸入輸出雖然都是字符串類型的,但事實上,Map 和 Reduce 函數都是有相應類型的。map (k1, v1) -> list(k2, v2)reduce (k2, list(v2)) -> list(v2)

猜想:map、reduce 函數中間感覺又觸發了“針對同一個單詞的 value 的組合(也就是把相同單詞出現的次數,串在一起)”,不然 reduce 函數怎麼能接收到 values(每個單詞對應的出現次數的一串“1”)。

騎驢看劇本,咱們還是走著瞧唄。

疑問1:map 產生的中間鍵值對,是放到內存、本地磁盤還是放到了 GFS 上存儲?

這個問題也是騎驢看劇本,咱們還是走著瞧唄(貌似用錯了語境,別介意,哈哈)。

疑問2:我們寫好了 Map 函數和 Reduce 函數,怎麼就跑到了多臺機器上呢?

欲知後事如何,咱們還是且聽下回分解。


分享到:


相關文章: