Google MapReduce到底解決什麼問題?
Google MapReduce是Google產出的一個編程模型,同時Google也給出架構實現,它可以解決「能用分治法解決的問題」。程序員
Google MapReduce有啥巧妙優化?
編程
先看下整體架構圖,有個直觀的印象。服務器
畫外音:
不妨假設,用戶設置了M個map節點,R個reduce節點;例如:M=500,R=200架構
(1) 在集羣中建立大量可執行實例副本(fork);負載均衡
(2) 這些副本中有一個master,其餘均爲worker,任務的分配由master完成, M個map實例和R個reduce實例由worker完成;分佈式
(3) 將輸入數據分紅M份,而後被分配到map任務的worker,從其中一份讀取輸入數據,執行用戶的map函數處理,並在本地內存生成臨時數據;ide
(4) 本地內存臨時數據,經過分區函數,被分紅R份,週期性的寫到本地磁盤,由master調度,傳給被分配到reduce任務的worker;函數
(5) 負責reduce任務的worker,從遠程讀取多個map輸出的數據,執行用戶的reduce函數處理,處理結果寫入輸出文件;
畫外音:可能對key要進行外部排序。優化
(6) 全部map和reduce的worker都結束工做後,master喚醒用戶程序,MapReduce調用返回,結果被輸出到了R個文件中。線程
(1) master:單點master會存儲一些元數據,監控全部map與reduce的狀態,記錄哪一個數據要給哪一個map,哪一個數據要給哪一個reduce,掌控全局視野,作中控;
畫外音:是否是和GFS的master很是像?
(2) worker:多個worker進行業務邏輯處理,具體一個worker是用來執行map仍是reduce,是由master調度的;
畫外音:是否是和工做線程池很是像?這裏的worker是分佈在多臺機器上的而已。
一個簡單的方法是,將元數據固化到磁盤上,用一個shadow-master來作高可用。
畫外音:GFS不就是這麼幹的麼?
然而現實狀況是:沒有將元數據固化到磁盤上,元數據被存放在master的內存裏用以提升工做效率,當master掛掉後,通知用戶「任務執行失敗」,讓其選擇從新執行。
畫外音:
(1) 單點master,掌控全局視野,能讓系統的複雜性下降很是多;
(2) master掛掉的機率很小;
(3) 不作高可用,能讓系統的複雜性下降很是多;
master會週期性的ping每一個worker,若是超時未返回,master會把對應的worker置爲無效,把這個worker的工做任務從新執行:
在用戶輸入不變的狀況下,MR的輸出必定是不變的,這就要求MR系統必須具有冪等性:
一個MR執行時間的最大短板,每每是「長尾worker」。
致使「長尾worker」的緣由有不少:
(1) 用戶的分區函數設計得不合理,致使某些reduce負載不均,要處理大量的數據;
畫外音:
最壞的狀況,全部數據最終都落到一個reduce上,分佈式並行處理,轉變爲了單機串行處理;
因此,分區函數的負載均衡性,是用戶須要考慮的。
(2) 由於系統的緣由,worker所在的機器磁盤壞了,CPU有問題,也可能致使任務執行很慢;
GoogleMR有一個「備用worker」的機制,當某些worker的執行時間超出預期時,會啓動另外一個worker執行相同的任務,以嘗試解決長尾效應。
總結
Google MapReduce架構,提現了不少經典架構實踐:
架構師之路-分享可落地的技術文章
相關推薦:
《GFS架構啓示》
《Google MapReduce解決什麼問題?》
《Google MapReduce巧妙優化思路?》
《過載保護+異構服務器的負載均衡》
《程序員養女兒的四大要點!》
做業:MR中有大量的數據進行傳輸,如何進行優化呢?