Hadoop平行計算原理與分布式併發程式設計

2021-06-10 19:25:52 字數 3398 閱讀 1468

我們通常說的分布式系統其實是分布式軟體系統,即支援分布式處理的軟體系統,它是在通訊網路互聯的多處理機體系結構上執行任務的,包括分布式

作業系統、分布式程式語言及其編譯(解釋)系統、分布式檔案系統和分布式資料庫系統等。hadoop是分布式軟體系統中檔案系統這一層的軟體,它實現了分布式檔案系統和部分分布式資料庫的功能。hadoop中的分布式檔案系統hdfs能夠實現資料在計算機集群組成的雲上高效的儲存和管理,hadoop中的並行程式設計框架mapreduce能夠讓使用者編寫的hadoop並行應用程式執行更加簡化。下面簡單介紹一下基於hadoop進行分布式併發程式設計的相關知識:

hadoop上的並行應用程式開發是基於mapreduce程式設計框架的。mapreduce程式設計模型的原理是:利用乙個輸入的key/value 對集合來產生乙個輸出的key/value 對集合。mapreduce庫的使用者用兩個函式來表達這個計算:map和reduce。

使用者自定義的map函式接收乙個輸入的key/value 對,然後產生乙個中間key/value 對的集合。mapreduce把所有具有相同key值的value集合在一起,然後傳遞給reduce函式。

使用者自定義的reduce函式接收key和相關的value集合。reduce函式合併這些value值,形成乙個較小的value集合。一般來說,每次reduce函式呼叫只產生0或1個輸出的value值。通常我們通過乙個迭代器把中間的value值提供給reduce 函式,這樣就可以處理無法全部放入記憶體中的大量的value值集合了。

下圖是mapreduce的資料流圖,這個過程簡而言之就是將大資料集分解為成百上千個小資料集,每個(或若干個)資料集分別由集群中的乙個節點(一般就是一台普通的計算機)進行處理並生成中間結果,然後這些中間結果又由大量的節點合併,形成最終結果。下圖也指出了mapreduce框架下並行程式中的三個主要函式:map、reduce、main。在這個結構中,需要使用者完成的工作僅僅是根據任務編寫map和reduce兩個函式。

▲圖 mapreduce的資料流圖

mapreduce計算模型非常適合在大量計算機組成的大規模集群上並行執行。上圖中的每乙個map 任務和每乙個reduce 任務均可以同時執行於乙個單獨的計算節點上,可想而知,其運算效率是很高的,那麼這樣的平行計算是如何做到的呢?下面將簡單介紹一下其原理。

1.資料分布儲存

hadoop分布式檔案系統(hdfs)由乙個名稱節點(namenode )和n個資料節點 (datanode)組成,每個節點均是一台普通的計算機。在使用方式上hdfs與我們熟悉的單機檔案系統非常類似,它可以建立目錄,建立、複製和刪除檔案,以及檢視檔案的內容等。但hdfs底層把檔案切割成了block,然後這些 block 分散地儲存於不同的 datanode 上,每個 block 還可以複製數份資料儲存於不同的 datanode 上,達到容錯容災的目的。namenode 則是整個 hdfs 的核心,它通過維護一些資料結構來記錄每乙個檔案被切割成了多少個 block、這些 block 可以從哪些 datanode 中獲得,以及各個 datanode 的狀態等重要資訊。

2. 分布式平行計算

hadoop 中有乙個作為主控的 jobtracker,用於排程和管理其他的 tasktracker,jobtracker 可以執行於集群中的任意一台計算機上。tasktracker則負責執行任務,它必須執行於 datanode 上,也就是說datanode 既是資料儲存節點,也是計算節點。 jobtracker 將 map 任務和 reduce 任務分發給空閒的 tasktracker,讓這些任務並行執行,並負責監控任務的運**況。如果某乙個 tasktracker 出了故障,jobtracker 會將其負責的任務轉交給另乙個空閒的 tasktracker 重新執行。

3. 本地計算

資料儲存在哪一台計算機上,就由哪台計算機進行這部分資料的計算,這樣可以減少資料在網路上的傳輸,降低對網路頻寬的需求。在 hadoop 這類基於集群的分布式並行系統中,計算節點可以很方便地擴充,它所能夠提供的計算能力近乎無限,但是由於資料需要在不同的計算機之間流動,故網路頻寬變成了瓶頸,「本地計算」是一種最有效的節約網路頻寬的手段,業界把這形容為「移動計算比移動資料更經濟」。

4. 任務粒度

把原始大資料集切割成小資料集時,通常讓小資料集小於或等於 hdfs 中乙個 block 的大小(預設是64mb),這樣能夠保證乙個小資料集是位於一台計算機上的,便於本地計算。有 m 個小資料集待處理,就啟動 m 個 map 任務,注意這 m 個map 任務分布於 n 臺計算機上,它們會並行執行,reduce 任務的數量 r 則可由使用者指定。

5. 資料分割(partition)

把 map 任務輸出的中間結果按 key 的範圍劃分成r份(r是預先定義的reduce 任務的個數),劃分時通常使用 hash 函式(如:hash(key) mod r),這樣可以保證某一範圍內的 key一定是由乙個 reduce 任務來處理的,可以簡化 reduce 的過程。

6. 資料合併(combine)

在資料分割之前,還可以先對中間結果進行資料合併(combine),即將中間結果中有相同 key的 對合併成一對。combine 的過程與reduce 的過程類似,很多情況下可以直接使用reduce 函式,但 combine 是作為map 任務的一部分,在執行完map函式後緊接著執行的。combine 能夠減少中間結果中 對的數目,從而降低網路流量。

7. reduce

map 任務的中間結果在做完 combine 和 partition 之後,以檔案形式存於本地磁碟上。中間結果檔案的位置會通知主控 jobtracker,jobtracker 再通知 reduce 任務到哪乙個 datanode 上去取中間結果。注意,所有的map 任務產生的中間結果均按其key 值用同乙個 hash 函式劃分成了r份,r個reduce 任務各自負責一段key 區間。每個reduce 需要向許多個map 任務節點取得落在其負責的key 區間內的中間結果,然後執行reduce函式,形成乙個最終的結果檔案。

8. 任務管道

有 r 個 reduce 任務,就會有 r 個最終結果,很多情況下這 r 個最終結果並不需要合併成乙個最終結果,因為這 r 個最終結果又可以作為另乙個計算任務的輸入,開始另乙個平行計算任務,這也就形成了任務管道。

這裡簡要介紹了在並行程式設計方面hadoop中mapreduce程式設計模型的原理、流程、程式結構和平行計算的實現,mapreduce程式的詳細流程、程式設計介面、程式例項等請參見後面章節。

作者簡介

陸嘉恆,《hadoop實戰》作者,中國人民大學副教授,新加坡國立大學博士,美國加利福尼亞大學爾灣分校(university of california, irvine) 博士後。

平行計算與分布式計算

主要內容來自維基百科 分布式系統是聯網計算機組,其工作目標相同。術語 併發計算 平行計算 和 分布式計算 有很多重疊,它們之間沒有明顯的區別。15 同一系統可以表徵為 並行 和 分布式 典型分布式系統中的處理器並行執行。16 平行計算可以被看作分布式計算的乙個特定的緊密耦合的形式,17 和分布式計算...

python平行計算 python平行計算

0.基礎並行 發 multiprocessing threading 1.concurrent 2.併發 asynico 3.ipython下的平行計算 使用ipyparallel庫的ipython提供了前所未有的能力,將科學python的探索能力與幾乎即時訪問多個計算核心相結合。系統可以直觀地與本...

R與平行計算

本文在creative commons許可證下發布 什麼是平行計算?平行計算,準確地說應該包括高效能計算機和並行軟體兩個方面。不過,近年來隨著個人pc機,廉價機群,以及各種加速卡 nvidia gpu,intel xeon phi,fpga 的快速發展,現在個人電腦已經完全可以和過去的高效能計算機相...