什么是分布式計算?簡單地說,分布式計算就是研究如何把一個需要非常巨大的計算能力才能解決的問題分成許多小的部分,然后把這些部分分配給許多計算機進行處理,最后把這些計算結果綜合起來得到最終的結果。
為了形象起見,這里舉一個采用蒙特卡羅算法計算圓周率π的例子來具體說明什么是分布式計算。如圖1所示,假設有一個內嵌圓形的正方形,圓的半徑為r,面積為S1,正方形的邊長為2r,面積為S2。
圖1 π的計算方法
分別計算圓形和正方形面積,則得到如下公式。
計算推導可得如下公式。
接下來,根據上述推導結果我們可將圓周率的計算轉換為以下計算任務。
(1)在正方形內隨機生成一些點,假設其個數為x;
(2)計算這些點落在圓形內的個數,假設計算結果為y;
(3)則圓周率π=4y/x。
顯然,x取值越大,圓周率的計算結果就越精確,但同時對計算資源的消耗也就越大。當x大到一定程度時,單個計算機已經無法在短時間內完成任務了。為此,我們需要對其進行拆分,得到以下分布式算法。
(1)在正方形內隨機生成一些點,假設其個數為x;
(2)假設目前有m個計算機可用,則每個計算機分配的計算任務為x/m個點的隨機統計;
(3)每個計算機分別計算這些點落在圓形內的個數,并各自得到計算結果為y1、y2、y3…
(4)假設這m臺計算機中1臺為主計算機,主機算機匯總各計算機的計算結果,得到y=y1+y2+y3+…;
(5)圓周率π=4y/x。
這個例子很簡單,不過我想對于一個復雜的分布式計算任務來說,如何分配計算任務、計算過程中各計算節點間如何相互配合等問題可能還是挺難解決的。
的確如此,近來隨著Google公司提出采用MapReduce計算模型并取得不錯的應用效果以來,針對MapReduce技術的研究和探討就變得越來越熱門,它也稱得上是云計算的標志性技術之一了。
什么是MapReduce呢?
我們還是用一個具體的例子來說明什么是MapReduce吧,假設要對三個句子中每個英文單詞出現的次數進行統計,圖2給出了采用MapReduce模型解決該問題的過程。
圖2 MapReduce的基本原理具體來說,處理過程如下。
(1)分配計算任務,計算機A、B、C得到句子1、2、3的map任務;
(2)各計算機各自進行map處理,例如計算機A對句子1進行map處理后得到中間結果(map,1)、(is,1)、(good,1),,這里將map、is和good稱為關鍵字,將關鍵字出現的次數(這里均為1)稱為中間值;
(3)以中間結果里面的關鍵字對中間結果進行混排聚合處理(shuffle),并分配reduce計算任務,例如計算機2得到對三個(is,1)進行reduce處理的任務;
(4)各計算機各自進行reduce處理,得到統計結果,例如計算機2的reduce結果為(is,3),即表示單詞is在三個句子中一共出現了三次。(5)匯總各計算機的結果即得到最終結果。
Google公司的MapReduce是怎么實現的?
如圖3所示,Google公司在其MapReduce工作模型中定義了用戶程序(User Program)、主服務器(Master)和工作服務器(worker)三種角色。
圖3 Google的MapReduce
當用戶程序需要發起一次MapReduce計算任務時,整個處理流程如下。
(1)用戶程序調用MapReduce庫將輸入文件劃分為多個塊,每個塊的大小一般為16~64MB(可以定制),然后啟動主服務器和相關工作服務器;
(2)主服務器將map和reduce任務分配給空閑的工作服務器,并把劃分好的輸入數據塊分配給各map任務;
(3)map任務對輸入數據塊進行處理,得到輸入對,然后將這些對傳遞給用戶編寫的map函數,經處理后產生中間結果對;
(4)這些緩存在內存中的中間結果對被周期性地寫入本地硬盤,同時map任務將存儲位置上報給主服務器,再由主服務器告知reduce任務;
(5)當reduce任務接收到主服務器關于中間結果的位置通知后,它就從指定位置讀取中間結果并同時以key為索引進行排序和聚合處理;
(6)reduce任務對聚合后的中間結果調用用戶編寫的reduce函數進行處理,處理結果被保存到輸出文件中,如果一個reduce任務中出現多個key索引時,它需要迭代處理所有的key索引;
(7)當所有map和reduce任務都完成以后,主服務器負責通知用戶程序,用戶程序匯總各reduce任務的輸出文件得到最終結果,或者將這些輸出文件當作下一輪MapReduce計算的輸入數據。
為什么Google公司提出MapReduce這種分布式模型后得到了這么多的關注呢?
這主要還是因為Google公司采用這種模型解決了其實際問題,所以大家才會這么重視MapReduce技術的研究。
我們知道,Google公司最成功的應用應該算是其搜索引擎了,搜索引擎中的一個重要工作就是需要統計爬蟲程序搜集的海量網頁數據中各個單詞出現的次數。根據相關報道,Google搜集的網頁所占存儲空間超過400TB,假設一臺計算機以30MB/s的速度讀取這些數據,將會至少需要4個月的時間,而在其集群系統采用MapReduce方法后可以將該時間縮短到3個小時。
Hadoop的MapReduce又是怎樣的?
如圖4所示,Hadoop在其MapReduce模型中定義了用戶程序(ClientProgram)、作業服務器(Job Tracker)和任務服務器(Task Tracker)三種角色。
圖4 Hadoop的MapReduce
可以看出,Hadoop的MapReduce與Google的MapReduce非常相似,其作業服務器類似于Google的主服務器,任務服務器類似于Google的工作服務器。
實際上,Hadoop開源項目的MapReduce子項目也正是參考Google關于MapReduce的論文設計實現的,所以兩者如此相似也就不足為奇了。