全面瞭解大資料“三駕馬車”的開源實現

weixin_33766168發表於2019-02-14

Google File System(GFS)的開源實現:HDFS

Google大資料“三駕馬車”的第一駕是GFS(Google檔案系統),而Hadoop的第一個產品是HDFS,可以說分散式檔案儲存是分散式計算的基礎,也可見分散式檔案儲存的重要性。

HDFS是在一個大規模分散式伺服器叢集上,對資料分片後進行並行讀寫及冗餘儲存。
\"\"
從圖中你可以看到HDFS的關鍵元件有兩個,一個是DataNode,一個是NameNode。

DataNode負責檔案資料的儲存和讀寫操作,HDFS將檔案資料分割成若干資料塊(Block),每個DataNode儲存一部分資料塊,這樣檔案就分佈儲存在整個HDFS伺服器叢集中。應用程式客戶端(Client)可以並行對這些資料塊進行訪問,從而使得HDFS可以在伺服器叢集規模上實現資料並行訪問,極大地提高了訪問速度。

NameNode負責整個分散式檔案系統的後設資料(MetaData)管理,也就是檔案路徑名、資料塊的ID以及儲存位置等資訊,相當於作業系統中檔案分配表(FAT)的角色。HDFS為了保證資料的高可用,會將一個資料塊複製為多份(預設情況為3份),並將多份相同的資料塊儲存在不同的伺服器上,甚至不同的機架上。這樣當有磁碟損壞,或者某個DataNode伺服器當機,甚至某個交換機當機,導致其儲存的資料塊不能訪問的時候,客戶端會查詢其備份的資料塊進行訪問。

放大一下看資料塊多份複製儲存的實現。圖中對於檔案/users/sameerp/data/part-0,其複製備份數設定為2,儲存的BlockID分別為1、3。Block1的兩個備份儲存在DataNode0和DataNode2兩個伺服器上,Block3的兩個備份儲存DataNode4和DataNode6兩個伺服器上,上述任何一臺伺服器當機後,每個資料塊都至少還有一個備份存在,不會影響對件/users/sameerp/data/part-0的訪問。
\"\"

和RAID一樣,資料分成若干資料塊後儲存到不同伺服器上,可以實現資料大容量儲存,並且不同分片的資料可以並行進行讀/寫操作,進而實現資料的高速訪問。

檢視HDFS高可用設計

檢視RAID儲存方案

MapReduce的開源實現:Hadoop MapReduce

在我看來,MapReduce既是一個程式設計模型,又是一個計算框架。也就是說,開發人員必須基於MapReduce程式設計模型進行程式設計開發,然後將程式通過MapReduce計算框架分發到Hadoop叢集中執行。我們先看一下作為程式設計模型的MapReduce。

舉個WordCount的例子,WordCount主要解決的是文字處理中詞頻統計的問題,就是統計文字中每一個單詞出現的次數。MapReduce版本WordCount程式的核心是一個map函式和一個reduce函式。

map函式的輸入主要是一個\u0026lt;Key, Value\u0026gt;對,在這個例子裡,Value是要統計的所有文字中的一行資料,Key在一般計算中都不會用到。

map函式的計算過程是,將這行文字中的單詞提取出來,針對每個單詞輸出一個\u0026lt;word, 1\u0026gt;這樣的\u0026lt;Key, Value\u0026gt;對。

MapReduce計算框架會將這些\u0026lt;word , 1\u0026gt;收集起來,將相同的word放在一起,形成\u0026lt;word , \u0026lt;1,1,1,1,1,1,1…\u0026gt;\u0026gt;這樣的\u0026lt;Key, Value集合\u0026gt;資料,然後將其輸入給reduce函式。

這裡reduce的輸入引數Values就是由很多個1組成的集合,而Key就是具體的單詞word。

reduce函式的計算過程是,將這個集合裡的1求和,再將單詞(word)和這個和(sum)組成一個\u0026lt;Key, Value\u0026gt;,也就是\u0026lt;word, sum\u0026gt;輸出。每一個輸出就是一個單詞和它的詞頻統計總和。

一個map函式可以針對一部分資料進行運算,這樣就可以將一個大資料切分成很多塊(這也正是HDFS所做的),MapReduce計算框架為每個資料塊分配一個map函式去計算,從而實現大資料的分散式計算。
\"\"

接下來我們來看作為計算框架,MapReduce是如何運作的。

以Hadoop 1為例,MapReduce執行過程涉及三類關鍵程式。

  • 大資料應用程式。這類程式是啟動MapReduce程式的主入口,主要是指定Map和Reduce類、輸入輸出檔案路徑等,並提交作業給Hadoop叢集,也就是下面提到的JobTracker程式。這是由使用者啟動的MapReduce程式程式,比如WordCount程式。
  • JobTracker程式。這類程式根據要處理的輸入資料量,命令下面提到的TaskTracker程式啟動相應數量的Map和Reduce程式任務,並管理整個作業生命週期的任務排程和監控。這是Hadoop叢集的常駐程式,需要注意的是,JobTracker程式在整個Hadoop叢集全域性唯一。
  • TaskTracker程式。這個程式負責啟動和管理Map程式以及Reduce程式。因為需要每個資料塊都有對應的map函式,TaskTracker程式通常和HDFS的DataNode程式啟動在同一個伺服器。也就是說,Hadoop叢集中絕大多數伺服器同時執行DataNode程式和TaskTacker程式。
    \"\"

檢視MapReduce啟動和執行的流程

MapReduce計算真正產生奇蹟的地方是資料的合併與連線。

還是回到WordCount例子中,我們想要統計相同單詞在所有輸入資料中出現的次數,而一個Map只能處理一部分資料,一個熱門單詞幾乎會出現在所有的Map中,這意味著同一個單詞必須要合併到一起進行統計才能得到正確的結果。

在map輸出與reduce輸入之間,MapReduce計算框架處理資料合併與連線操作,這個操作有個專門的詞彙叫shuffle。那到底什麼是shuffle?shuffle的具體過程又是怎樣的呢?請看下圖。
\"\"

每個Map任務的計算結果都會寫入到本地檔案系統,等Map任務快要計算完成的時候,MapReduce計算框架會啟動shuffle過程,在Map任務程式呼叫一個Partitioner介面,對Map產生的每個\u0026lt;Key, Value\u0026gt;進行Reduce分割槽選擇,然後通過HTTP通訊傳送給對應的Reduce程式。這樣不管Map位於哪個伺服器節點,相同的Key一定會被髮送給相同的Reduce程式。Reduce任務程式對收到的\u0026lt;Key, Value\u0026gt;進行排序和合並,相同的Key放在一起,組成一個\u0026lt;Key, Value集合\u0026gt;傳遞給Reduce執行。

map輸出的\u0026lt;Key, Value\u0026gt;shuffle到哪個Reduce程式是這裡的關鍵,它是由Partitioner來實現,MapReduce框架預設的Partitioner用Key的雜湊值對Reduce任務數量取模,相同的Key一定會落在相同的Reduce任務ID上。

講了這麼多,對shuffle的理解,你只需要記住這一點:分散式計算需要將不同伺服器上的相關資料合併到一起進行下一步計算,這就是shuffle。

BigTable的開源實現:HBase

HBase為可伸縮海量資料儲存而設計,實現面向線上業務的實時資料訪問延遲。HBase的伸縮性主要依賴其可分裂的HRegion及可伸縮的分散式檔案系統HDFS實現。
\"\"

HRegion是HBase負責資料儲存的主要程式,應用程式對資料的讀寫操作都是通過和HRetion通訊完成。上面是HBase架構圖,我們可以看到在HBase中,資料以HRegion為單位進行管理,也就是說應用程式如果想要訪問一個資料,必須先找到HRegion,然後將資料讀寫操作提交給HRegion,由 HRegion完成儲存層面的資料操作。

HRegionServer是物理伺服器,每個HRegionServer上可以啟動多個HRegion例項。當一個 HRegion中寫入的資料太多,達到配置的閾值時,一個HRegion會分裂成兩個HRegion,並將HRegion在整個叢集中進行遷移,以使HRegionServer的負載均衡。

每個HRegion中儲存一段Key值區間[key1, key2)的資料,所有HRegion的資訊,包括儲存的Key值區間、所在HRegionServer地址、訪問埠號等,都記錄在HMaster伺服器上。為了保證HMaster的高可用,HBase會啟動多個HMaster,並通過ZooKeeper選舉出一個主伺服器。

下面是一張呼叫時序圖,應用程式通過ZooKeeper獲得主HMaster的地址,輸入Key值獲得這個Key所在的HRegionServer地址,然後請求HRegionServer上的HRegion,獲得所需要的資料。
\"\"

資料寫入過程也是一樣,需要先得到HRegion才能繼續操作。HRegion會把資料儲存在若干個HFile格式的檔案中,這些檔案使用HDFS分散式檔案系統儲存,在整個叢集內分佈並高可用。當一個HRegion中資料量太多時,這個HRegion連同HFile會分裂成兩個HRegion,並根據叢集中伺服器負載進行遷移。如果叢集中有新加入的伺服器,也就是說有了新的HRegionServer,由於其負載較低,也會把HRegion遷移過去並記錄到HMaster,從而實現HBase的線性伸縮。

檢視HBase可擴充套件資料模型和高效能儲存

作者簡介:
李智慧,《從0開始學大資料》專欄作者,同程藝龍交通首席架構師、Apache Spark 原始碼貢獻者,長期從事大資料、大型網站架構的研發工作,曾擔任阿里巴巴技術專家、Intel亞太研發中心架構師、宅米和WiFi萬能鑰匙CTO,有超過6年的線下諮詢、培訓經驗,著有暢銷書《大型網站技術架構:核心原理與案例分析》。

相關文章