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

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函數的輸入主要是一個<Key, Value>對,在這個例子裏,Value是要統計的所有文本中的一行數據,Key在一般計算中都不會用到。

map函數的計算過程是,將這行文本中的單詞提取出來,針對每個單詞輸出一個<word, 1>這樣的<Key, Value>對。

MapReduce計算框架會將這些<word , 1>收集起來,將相同的word放在一起,形成<word , <1,1,1,1,1,1,1…>>這樣的<Key, Value集合>數據,然後將其輸入給reduce函數。

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

reduce函數的計算過程是,將這個集合裏的1求和,再將單詞(word)和這個和(sum)組成一個<Key, Value>,也就是<word, sum>輸出。每一個輸出就是一個單詞和它的詞頻統計總和。

一個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產生的每個<Key, Value>進行Reduce分區選擇,然後通過HTTP通信發送給對應的Reduce進程。這樣不管Map位於哪個服務器節點,相同的Key一定會被髮送給相同的Reduce進程。Reduce任務進程對收到的<Key, Value>進行排序和合並,相同的Key放在一起,組成一個<Key, Value集合>傳遞給Reduce執行。

map輸出的<Key, Value>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年的線下諮詢、培訓經驗,著有暢銷書《大型網站技術架構:核心原理與案例分析》。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章