谷歌“三駕馬車”的出現,才真正把我們帶入了大數據時代,畢竟沒有谷歌,就沒有大數據。 上次的分享,我們對谷歌的其中一駕寶車 GFS 進行了管中窺豹,雖然只見得其中一斑,但是也能清楚的知道 GFS 能夠把大量廉價的普通機器,聚在一起,充分讓每台廉價的機器發揮光和熱,不但降低了運營成本,而且解決了一個業界 ...
谷歌“三駕馬車”的出現,才真正把我們帶入了大數據時代,畢竟沒有谷歌,就沒有大數據。
上次的分享,我們對谷歌的其中一駕寶車 GFS 進行了管中窺豹,雖然只見得其中一斑,但是也能清楚的知道 GFS 能夠把大量廉價的普通機器,聚在一起,充分讓每台廉價的機器發揮光和熱,不但降低了運營成本,而且解決了一個業界數據存儲的難題。
雖然 GFS 解決了 Google 海量數據的存儲的難題,但是隨之而來的就是“如何從海量數據中快速計算並得到結果的難題”,面對這個難題,誰痛誰想辦法,Google 再次進行技術創新,重磅推出另一篇論文《MapReduce: Simplified Data Processing on Large Clusters》,接下來就一起認識認識 MapReduce。
認識
到底是個啥?說白了,MapReduce 其實就是一個為了簡化海量數據處理而提出的編程模型。
主要思想:分而治之,將一個大規模的問題,分成多個小規模的問題,把多個小規模問題解決,然後再合併小規模問題的解,就能夠解決大規模的問題。
編程模型:我們只需要通過編寫 Map 函數和 Reduce 函數來指定想要進行的計算,而不用花心思去糾結背後複雜的容錯、數據分發、負載均衡等等一系列技術細節問題。MapReduce 所執行的分散式計算會以一組鍵值對作為輸入,輸出另一組鍵值對。
怎麼想的?原來是受 Lisp 以及其它一些函數式編程語言中的 map 和 reduce 原語影響而來的(如果你閑著無聊,再去瞭解 Lisp 也不遲)。
疑惑
百思要求解。說了這麼多,感覺還是一無所知,顯然是一塊硬骨頭,其實在腦海中早已蕩起千層疑問的波。
Map 函數是啥?Reduce 函數又是啥?
接下來我們一起慢慢去體會。
統計大量文檔中每一個單詞出現的次數,這也是大數據技術入門的經典案例“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 函數,怎麼就跑到了多台機器上呢?
欲知後事如何,咱們還是且聽下回分解。