日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Google MapReduce有啥巧妙优化?

發布時間:2025/3/21 编程问答 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Google MapReduce有啥巧妙优化? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

搞架構的人,Google的架構論文是必看的,但好像大家都不愿意去啃英文論文。故把自己的讀書筆記,加入自己的思考,分享給大家。

《MapReduce到底解決什么問題?》做了簡介,這是第二篇,Google MapReduce優化啟示(中)。

?

什么是MapReduce?

MapReduce這個編程模型解決什么問題?

Google MapReduce是Google產出的一個編程模型,同時Google也給出架構實現。它能夠解決“能用分治法解決的問題”。

?

同時,前文以“統計大量文檔中單詞出現的個數”為例,例舉了如何“先分再合”的撰寫map與reduce來解決實際問題。

畫外音,強烈建議回顧一下前情提要:

《MapReduce到底解決什么問題?》。


MapReduce的核心思路是:

  • 并行

  • 先分再合

?

下圖簡述了MR計算“詞頻統計”的過程。

從左到右四個部分,分別是:

  • 輸入文件

  • 分:M個并行的map計算實例

  • 合:R個并行的reduce計算實例

  • 輸出結果

?

先看最后一步,reduce輸出最終結果。

可以看到,R個reduce實例并發進行處理,直接輸出最后的計數結果。

實例1輸出:(a, 256)(able, 128)(emacs, 1)

實例2輸出:(f*ck, 32768) (coding, 65535)

實例3輸出:(vim,65535)(x, 16)(zero, 258)

畫外音:這就是總結果,可以看到vim比emacs受歡迎很多。

需要理解的是,由于這是業務計算的最終結果,一個單詞的計數不會出現在兩個實例里。即:如果(a, 256)出現在了實例1的輸出里,就一定不會出現在其他實例的輸出里。

畫外音:否則的話,還需要合并,就不是最終結果了。

?

再看中間步驟,map到reduce的過程。

可以看到,M個map實例的輸出,會作為R個reduce實例的輸入。

?

潛在問題一:每個map都有可能輸出(a, 1),而最終結果(a, 256)必須由一個reduce輸出,那如何保證每個map輸出的同一個key,落到同一個reduce上去呢?

這就是“分區函數”的作用。

?

什么是分區函數?

分區函數,是使用MapReduce的用戶需所實現的,決定map輸出的每一個key應當落到哪個reduce上的函數。

畫外音:如果用戶沒有實現,會使用默認分區函數。

?

以詞頻統計的應用為例,分區函數可能是:

(1) 以[a-g]開頭的key落到第一個reduce實例;

(2) 以[h-n]開頭的key落到第二個reduce實例;

(3) 以[o-z]開頭的key落到第三個reduce實例;

畫外音:有點像數據庫水平切分的“范圍法”。

?

分區函數實現要點是什么?

為了保證每一個reduce實例都能夠差不多時間結束工作任務,分區函數的實現要點是:盡量負載均衡。

畫外音:即數據均勻分攤。

?

上述詞頻統計的分區函數,就不是負載均衡的,有些reduce實例處理的單詞多,有些reduce處理的單詞少,這樣就可能出現,所有reduce實例都處理結束,最后等待一個長尾reduce的情況。

?

對于詞頻統計,負載更為均衡的分區函數為:

hash(key) % 3

畫外音:有點像數據庫水平切分的“哈希法”。

?

潛在問題二:每個map都有可能輸出多個(a, 1),這樣無形中增大了網絡帶寬資源,以及reduce的計算資源,有沒有辦法進行優化呢?

這就是“合并函數”的作用。

?

什么是合并函數?

有時,map產生的中間key的重復數據比重很大,可以提供給用戶一個自定義函數,在一個map實例完成工作后,本地就做一次合并,這樣網絡傳輸與reduce計算資源都能節省很多。

?

合并函數在每個map任務結束前都會執行一次,一般來說,合并函數與reduce函數是一樣的,區別是:

  • 合并函數執行map實例本地數據合并

  • reduce函數執行最終的合并,會收集多個map實例的數據

?

對于詞頻統計應用,合并函數可以將:

一個map實例的多個(a, 1)合并成一個(a, $count)輸出。

?

最后看第一個個步驟,輸入文件到map的過程。

潛在問題三:如何確定文件到map的輸入呢?

隨意即可,只要負載均衡,均勻切分輸入文件大小就行,不用管分到哪個map實例。

畫外音:無論分到那個map都能正確處理。

?

結論

Google MapReduce實施了一系列的優化。

  • 分區函數:保證不同map輸出的相同key,落到同一個reduce里

  • 合并函數:在map結束時,對相同key的多個輸出做本地合并,節省總體資源

  • 輸入文件到map如何切分:隨意,切分均勻就行

?

希望大家對MapReduce的優化思路有一個了解,思路比結論更重要

?

下章,講Google MapReduce的工程架構實現。

總結

以上是生活随笔為你收集整理的Google MapReduce有啥巧妙优化?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。