1. 程式人生 > >為什麼說,MapReduce,顛覆了網際網路分層架構的本質?

為什麼說,MapReduce,顛覆了網際網路分層架構的本質?

為什麼說,MapReduce系統架構,顛覆了網際網路分層架構的本質?

下圖是一個典型的,網際網路分層架構:
image
客戶端層:典型呼叫方是瀏覽器browser或者手機APP

站點應用層:實現核心業務邏輯,從下游獲取資料,對上游返回html或者json

服務層:業務服務,資料服務,基礎服務,對上游提供友好的RPC介面

資料快取層:快取加速訪問儲存

資料固化層:資料庫固化資料儲存

同一個層次的內部,例如端上的APP,以及web-server,也都會進行MVC分層:
image
view層:展現

control層:邏輯

model層:資料

工程師骨子裡,都潛移默化的實施著分層架構設計。

網際網路分層架構的本質究竟是什麼呢?

如果我們仔細思考會發現,不管是跨程序的分層架構,還是程序內的MVC分層,都是一個“資料移動”,然後“被處理”和“被呈現”的過程。
image
如上圖所示:

資料處理和呈現,需要CPU計算,而CPU是固定不動的:

db/service/web-server都部署在固定的叢集上

端上,不管是browser還是APP,也有固定的CPU處理

而資料是移動的:

跨程序的:資料從資料庫和快取裡,轉移到service層,到web-server層,到client層

同進程的:資料從model層,轉移到control層,轉移到view層

歸根結底一句話:網際網路分層架構,是一個CPU固定,資料移動的架構。

畫外音:更詳細的分析,詳見《網際網路分層架構的本質》。

MapReduce的架構,是不是也遵循這個架構特點呢?

假如MapReduce也使用類似的的分層架構模式:
image
提前部署服務:

map服務層:接收輸入資料,產出“分”的資料,叢集部署M=1W個例項

reduce服務層:接受“合”的資料,產出最終資料,叢集部署R=1W個例項

當用戶提交作業時:

(1) 把資料資料傳輸給map服務叢集;

(2) map服務叢集產出結果後,把資料傳輸給reduce服務叢集;

(3) reduce服務叢集把結果傳輸給使用者;

存在什麼問題?

將有大量的時間浪費在大量資料的網路傳輸上。

畫外音:輸入給map,map給reduce,reduce給使用者。

會發現,“固定CPU,移動資料”的架構並不適合。

Google MapReduce工程架構是如何思考這一個問題的呢?
image
問了減少資料量的傳輸:

(1) 輸入資料,被分割為M塊後,master會盡量將執行map函式的worker例項,啟動在輸入資料所在的伺服器上;

畫外音:不需要網路傳輸了。

(2) map函式的worker例項輸出的的結果,會被分割槽函式劃分成R塊,寫到worker例項所在的本地磁碟;

畫外音:不需要網路傳輸了。

(3) reduce函式,由於有M個輸入資料來源(M個map的輸出都有一部分資料可能對應到一個reduce的輸入資料),所以,master會盡量將執行reduce函式的worker例項,啟動在離這些輸入資料來源儘可能“近”的伺服器上;

畫外音:目的也是最小化網路傳輸;

伺服器之間的“近”,可以用內網IP地址的相似度衡量。

所以,對於MapReduce系統架構,“固定資料,移動CPU”更為合理。

這是為什麼呢?

網際網路線上業務的特點是:

總資料量大

吞吐量比較大,同時發起的請求多

每個請求,處理的資料相對比較小

使用者對處理時延比較敏感

這類業務,使用“固定CPU,移動資料”的分層架構是合理的。

MapReduce離線業務的特點是:

吞吐量比較小,同時發起的任務比較少

每個任務,處理的資料量非常大

使用者對處理時延容忍性大

這類業務,使用“固定資料,移動CPU”的分層架構是合理的。
任何脫離業務的架構設計,都是耍流氓。

思考問題的本質,希望大家有收穫。
原文釋出時間為:2018-12-14
本文作者: 58沈劍
本文來自雲棲社群合作伙伴“ 架構師之路”,瞭解相關資訊可以關注“road5858”微信公眾號