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既是乙個程式設計模型,又是乙個計算框架。也就是說,開發人員必須基於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啟動和執行的流程
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上。
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年的線下諮詢、培訓經驗,著有暢銷書《大型**技術架構:核心原理與案例分析》。
全面了解大資料「三駕馬車」的開源實現
google file system gfs 的開源實現 hdfs mapreduce 的開源實現 hadoop mapreduce bigtable 的開源實現 hbase1.hdfs 是在乙個大規模分布式伺服器集群上,對資料分片後進行並行讀寫及冗餘儲存。2.hdfs 的關鍵元件有兩個,乙個是 d...
全面了解大資料「三駕馬車」的開源實現
google大資料 三駕馬車 的第一駕是gfs google檔案系統 而hadoop的第乙個產品是hdfs,可以說分布式檔案儲存是分布式計算的基礎,也可見分布式檔案儲存的重要性。hdfs是在乙個大規模分布式伺服器集群上,對資料分片後進行並行讀寫及冗餘儲存。從圖中你可以看到hdfs的關鍵元件有兩個,乙...
全面了解大資料「三駕馬車」的開源實現
google大資料 三駕馬車 的第一駕是gfs google檔案系統 而hadoop的第乙個產品是hdfs,可以說分布式檔案儲存是分布式計算的基礎,也可見分布式檔案儲存的重要性。hdfs是在乙個大規模分布式伺服器集群上,對資料分片後進行並行讀寫及冗餘儲存。從圖中你可以看到hdfs的關鍵元件有兩個,乙...