20分鐘看懂大數據分布式計算

前言

這是一篇科普性質的文章,希望能過用一個通俗易懂的例子給非計算機專業背景的朋友講清楚大數據分布式計算技術。大數據技術雖然包含存儲、計算和分析等一系列龐雜的技術,但分布式計算一直是其核心,想要了解大數據技術,不妨從MapReduce分布式計算模型開始。該理論模型并不是什么新理念,早在2004年就被Google發布,經過十多年的發展,儼然已經成為了當前大數據生態的基石,可謂大數據技術之道,在于MapReduce。

傳統計算技術

在進入到分布式計算技術這個概念之前,我們要先回顧一下傳統計算技術,為了使計算機領域的相關概念能夠生動形象深入淺出,我們要將計算機類比為人:


在這張圖中我們建立了計算機基本元件的類比關系,并不嚴謹但足以說明問題,如果你對中央處理器(CPU)、內存等概念還有一些模糊,相信看完這張圖就可以理解他們的作用。有了這個類比關系,我們可以把計算機領域的問題轉換為我們熟悉的人類領域的問題,從現在開始,每個人,比如你自己就是一臺計算機,我們代稱為“人型計算機”,你擁有基本的計算機元件,上帝是個程序員,可以編寫程序——一系列設定好的指令,讓你完成一些計算任務。

下面我們要用一個簡單的案例,分析“人型計算機”是如何利用傳統計算技術解決實際問題的。在開始之前,要增加一些限定,如同正常計算機的內存是有上限的,我們的“人型計算機”也存在記憶力的上限,這里我們假設一個“人型計算機”最多可以同時在“內存”中記住4種信息,例如:蘋果、梨等四種水果的個數:


看起來這臺“人型計算機”的性能比較差,不過好在我們需要處理的問題也不復雜:有幾十張不包含大王和小王的撲克牌,這些牌的花色和大小均不確定(并不一定能湊成一副牌),如何給一臺“人型計算機”設計一個程序,統計各個花色的撲克牌的數量?

你的答案可能脫口而出:對于“人型計算機”而言,直接在大腦中記住每個花色的個數,一張一張地取撲克牌計數,處理完所有的撲克牌之后報4個花色的個數就行。答案完全正確,正常計算機最簡單的計算模式就是這樣的,內存中記錄統計結果,隨著輸入設備不斷讀取數據,更新內存中的統計結果,最后從輸出設備展示結果:

接下來問題的難度要升級了,統計這些撲克牌中A~K共13種牌面每種牌面的個數。我們的“程序”該如何升級?

我們察覺到,如果仍然沿用之前的解決思路,“人型計算機”的“內存”已經不夠用了,因為其存儲上限為4種信息,無法存儲A~K這13種牌面信息。聯系一下現實生活中的場景,當我們發現自己無法記住很多信息時,會用賬本來輔助記憶,對于計算機來說是一樣的,內存不足就使用磁盤來存放信息,這時候,賬本就可以類比于一個存放于“磁盤”的Excel文檔:

那么統計牌面這個問題的解決思路就有了:每取一張撲克牌,在賬本中更新相應牌型的統計個數,數完所有的撲克牌之后直接報出結果:

單個計算機的傳統計算模式就是這樣,可以簡單概括為按照一定統一規則對輸入數據進行加減乘除等數學運算,然后輸出結果的過程,這中間產生的數據會存儲在內存或硬盤中。在上面的案例中,撲克牌是“人型計算機”的“輸入數據“,相當于計算機二進制世界中可以被識別的數字和文本。統計的撲克牌個數是“輸出結果“,則相當于你可以在電腦屏幕上看到的信息。
實際上,憑借內存、硬盤和CPU等基本組件,單個計算機(不只包括個人電腦,智能手機也算)已經可以完成我們上網聽歌看電影等日常基本需求中所涉及到的計算,只要計算不超出CPU的極限(譬如圍棋人機對戰之類的)是妥妥沒問題的,而且我們還有優化內存、優化硬盤等多種手段來增強單個計算機的計算能力,從而滿足人民群眾日益增長的物質與文化生活的需要。

好了,背景知識已經足夠了,讓我們進入正題

大數據分布式計算

首先,什么是分布式計算?簡單點理解就是將大量的數據分割成多個小塊,由多臺計算機分工計算,然后將結果匯總。這些執行分布式計算的計算機叫做集群,我們仍然延續前文中人和計算機的類比,那么集群就是一個團隊,單兵作戰的時代已經過去,團隊合作才是王道:



為什么需要分布式計算?因為“大數據”來了,單個計算機不夠用了,即數據量遠遠超出單個計算機的處理能力范圍:有時候是單位時間內的數據量大,比如在12306網上買票,每秒可能有數以萬計的訪問;也有可能是數據總量大,比如百度搜索引擎,要在服務器上檢索數億的中文網頁信息。

實現分布式計算的方案有很多,在大數據技術出現之前就已經有科研人員在研究,但一直沒有被廣泛應用。直到2004年Google公布了MapReduce之后才大熱了起來。大數據技術、分布式計算和MapReduce的關系可以用下圖來描述,MapReduce是分布式計算在大數據領域的應用:



MapReduce模型是經過商業實踐的成熟的分布式計算框架,與Google的分布式文件系統GFS、分布式數據存儲系統BigTable一起,號稱Google的大數據“三寶”,為大數據技術的發展提供了堅實的理論基礎。但遺憾的是,谷歌并沒有向外界公布自己的商業產品,而真正讓大數據技術大踏步前進的是按照Google理論實現的開源免費產品Hadoop,目前已經形成了以Hadoop為核心的大數據技術生態圈。


讓我們回到數撲克牌這個例子中,大數據時代的撲克牌問題是什么樣子的?

  1. 輸入數據的規模增加:撲克牌暴增到數萬張
  2. 中間運算數據的規模增加:問題又升級了,我們需要統計52種牌型每種牌型出現的次數
  3. 處理時間有限制:我們希望能盡快得到統計結果



    怎么樣,有沒有感覺到大數據撲面而來。要知道我們的“人型計算機”的“內存“和“硬盤”是有容量限制的,52種牌型的信息已經超出了單臺計算機的處理能力。當然這里會有人提出質疑,認為擴充內存或者磁盤容量就可以解決這個問題,52種牌型完全不需要分布式計算。那大家考慮一下假如這堆牌中有幾百種、甚至幾千種牌型呢?



    所以52種牌是為了符合現實中的情況,讓大家領會到單個計算機已經無法同時處理這么多數據了,我們需要多臺計算機一起協作,是時候放出MapReduce這個大招了。

我個人在查閱了一些資料、進行了一些實踐以后,認為MapReduce的技術可以簡單地用四字訣來總結:分、變、洗、合,分別代表“切分”、“變換”、“洗牌”、“合并”四個步驟:


下面來看如何用四字訣解決大數據撲克牌問題。

第一步,切分:把輸入數據切分成多份

既然單個“人型計算機”無法完全處理完所有的撲克,那么我們就把撲克牌隨機分成多份,每份撲克牌由一個“人型計算機”來處理,個數不超過單個計算機的處理上限,而且盡量讓每份的數量比較平均。



這里我們要講一下角色分工的問題,多臺計算機合作,肯定要有角色分工,我們把負責數據切分的“人型計算機”可以理解為“指揮官”,“指揮官”一般只有一個(在實際中可能有多個),統籌調度之類的工作都歸他管。負責執行具體運算任務的“人型計算機”則是“計算兵”,“計算兵”按照承擔的任務不同分為“變計算兵”和“合計算兵”,前者負責第二步“變換“,后者負責最后一步“合并“。



“計算兵”的總數當然是多多益善,但“變計算兵”和“合計算兵”各自所占的比例并不固定,可以根據數據的多少和運算的效率進行調整。當兵力不夠的時候,一個計算兵有可能承擔兩種角色,“指揮官”同時也有可能擔任“計算兵”,因為在實際情況中一臺計算機可以有多個進程承擔多個任務,即理論上講一個計算機可以分飾多角。

“指揮官”在切分撲克牌之前,會先分配好“變計算兵”和“合計算兵”的數量,然后根據“變計算兵”的數量把撲克拆分成相應的份數,將每份撲克分給一個“變計算兵”,然后進入下一步。


第二步,變換: 把每條輸入數據做映射變換(也就是MapReduce中的Map)

每一個“變計算兵”都要對自己分得的每一張撲克牌按照相同的規則做變換,使得后續的步驟中可以對變換后的結果做處理。這種變換可以是加減乘除等數學運算,也可以是對輸入數據的結構的轉換。例如對于我們這個撲克牌問題來講,目的是為了計數,所以可以將撲克牌轉換為一種計算機更容易處理的數值結構:將每張撲克牌上貼一張小便簽,這條小便簽上寫明了其個數為1。



我們把這種貼了標簽的撲克牌叫做變種撲克牌。當在后續的步驟中統計牌型個數時,只需要把每個標簽上的數字加起來就可以。有的朋友肯定會好奇為什么不讓每個“計算兵”直接統計各自的所有牌型的撲克的個數,這是因為這種“映射變換”運算的本質在于將每張撲克牌都進行同一種相同規則的變換,統計個數的工作要留在最后一步完成。嚴格的流水化操作,會讓整體的效率更高,而且變換的規則要根據具體問題來制定,更容易適配不同種類的計算。

第三步,洗牌:把變換后的數據按照一定規則分組

變換的運算完成之后,每個“變計算兵”要將各自的變種撲克牌按照牌型分成多個小份,每個小份要最終被一個指定的“合計算兵”進行結果合并統計,這個過程就是“洗牌”,是“變計算兵”將變換后的撲克牌按照規則分組并分配給指定的“合計算兵”的過程。



洗牌分兩個階段,第一階段是每個“變計算兵”將變種撲克牌按照一定的規則分類,分類的規則取決于每個“合計算兵”的統計范圍,分類的個數取決于“合計算兵”的個數。如上圖所示,假設有3個“合計算兵”分別負責不同范圍的牌型的統計,那么“變計算兵”需要根據每個“合計算兵”負責的牌型將自己的變種撲克牌分成3個小份,每份交給對應的“合計算兵”。洗牌的第二階段,“合計算兵”在指揮官的指揮下,去各個“變計算兵”的手中獲取屬于他自己的那一份變種撲克牌,從而使得牌型相同的撲克牌只會在一個“合計算兵”的手上。洗牌的意義在于使相同牌型的變種撲克牌匯聚在了一起,以便于統計。


第四步,合并:將洗牌后的數據進行統計合并(也就是MapReduce中的Reduce)

“合計算兵”將手中的變種撲克牌按照相同的計算規則依次進行合并,計算規則也需要根據具體問題來制定,在這里是對撲克牌上標簽的數值直接累加,統計出最終的結果。


然后所有的“合計算兵”把自己的計算結果上交給“指揮官”,“指揮官”匯總后公布最終統計的結果。


總結

ok,“分變洗合”四字訣介紹完畢,完整過程如下:



分布式處理技術在邏輯上并不復雜,但在具體的實現過程中會有很多復雜的過程,譬如“指揮官”如何協調調度所有的“運算兵”,“運算兵”之間如何通信等等,但對于使用MapReduce來完成計算任務的程序員來講,這些復雜的過程是透明的,分布式計算框架會自己去處理這些問題,程序員只需要定義兩種計算規則:第二步中變換的規則和第四步中合并的規則。

正所謂大道至簡,萬變不離其宗,理解了MapReduce就理解了大數據分布式處理技術,而理解大數據分布式處理技術,也就理解了大數據技術的核心。
如果你還沒有理解或者發現了文中的邏輯漏洞,歡迎留言討論。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,702評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,615評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,606評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,044評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,826評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,227評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,307評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,447評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,992評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,807評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,001評論 1 370
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,550評論 5 361
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,243評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,667評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,930評論 1 287
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,709評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,996評論 2 374

推薦閱讀更多精彩內容