BigTable的開源實現:HBase
Google發表GFS、MapReduce、BigTable三篇論文,號稱“三駕馬車”,開啟了大數據的時代。

GFS對應的Hadoop分布式文件系統HDFS
MapReduce對應的Hadoop分布式計算框架MapReduce
BigTable對應的NoSQL系統HBase,如何大規模處理海量數據
在計算機數據存儲領域,一直是關系數據庫(RDBMS)的天下,以至于在傳統企業的應用領域,許多應用系統設計都是面向數據庫設計,也就是先設計數據庫然后設計程序,從而導致關系模型綁架對象模型,并由此引申出曠日持久的業務對象貧血模型與充血模型之爭。
業界為了解決關系數據庫的不足,提出了諸多方案,比較有名的是對象數據庫,但是這些數據庫的出現似乎只是進一步證明關系數據庫的優越而已。直到人們遇到了關系數據庫難以克服的缺陷——糟糕的海量數據處理能力及僵硬的設計約束,局面才有所改善。從Google的BigTable開始,一系列的可以進行海量數據存儲與訪問的數據庫被設計出來,更進一步說,NoSQL這一概念被提了出來。
NoSQL,主要指非關系的、分布式的、支持海量數據存儲的數據庫設計模式。也有解讀為Not Only SQL,表示NoSQL只是關系數據庫的補充,而不是替代方案。其中,HBase是這一類NoSQL系統的杰出代表。
HBase之所以能具有海量數據處理能力,其根本在于和傳統關系型數據庫設計的不同思路。傳統關系型數據庫對存儲在其上的數據有很多約束,學習關系數據庫都要學習數據庫設計范式,事實上,是在數據存儲中包含了一部分業務邏輯。而NoSQL數據庫則簡單暴力地認為,數據庫就是存儲數據的,業務邏輯應該由應用程序處理。
HBase可伸縮架構
HBase為可伸縮海量數據儲存而設計,實現面向在線業務的實時數據訪問延遲。HBase伸縮性主要依賴其:
可分裂的HRegion
可伸縮的分布式文件系統HDFS實現
HRegion
HBase負責數據存儲的主要進程,應用程序對數據的讀寫操作都是通過和HRegion通信完成。
HBase中的數據以HRegion為單位進行管理,即應用程序若想訪問一個數據,必須先找到HRegion,然后將數據讀寫操作提交給HRegion,由HRegion完成存儲層面的數據操作。
HRegionServer是物理服務器,每個HRegionServer上可以啟動多個HRegion實例。當一個 HRegion中寫入的數據太多,達到配置的閾值時,一個HRegion會分裂成兩個HRegion,并將HRegion在整個集群中進行遷移,以使HRegionServer的負載均衡。
每個HRegion中存儲一段K值區間[key1, key2)的數據,所有HRegion的信息,包括存儲的K值區間、所在HRegionServer地址、訪問端口號等,都記錄在HMaster服務器。為保證HMaster高可用,HBase會啟動多個HMaster,并通過zk選出一個主服務器。
調用時序圖
應用程序通過zk獲得主HMaster地址,輸入K值獲得這個K所在的HRegionServer地址,然后請求HRegionServer上的HRegion,獲得所需數據。
數據寫入過程也一樣,需先得到HRegion才能繼續操作。HRegion會把數據存儲在若干個HFile格式的文件中,這些文件使用HDFS分布式文件系統存儲,在整個集群內分布并高可用。當一個HRegion中數據量太多時,這個HRegion連同HFile會分裂成兩個HRegion,并根據集群中服務器負載進行遷移。如果集群中有新加入的服務器,也就是說有了新的HRegionServer,由于其負載較低,也會把HRegion遷移過去并記錄到HMaster,從而實現HBase的線性伸縮。
小結
HBase的核心設計目標是解決海量數據的分布式存儲,和Memcached這類分布式緩存的路由算法不同,HBase的做法是按Key的區域進行分片,這個分片也就是HRegion。應用程序通過HMaster查找分片,得到HRegion所在的服務器HRegionServer,然后和該服務器通信,就得到了需要訪問的數據。
HBase可擴展數據模型
傳統關系數據庫為保證關系運算(通過SQL語句)的正確性,在設計數據庫表結構的時候,需要指定表的schema,即字段名稱、數據類型等,并遵循設計范式。這些規范帶來一個問題:僵硬的數據結構難以面對需求變更的挑戰,有些應用系統設計者通過預先設計一些冗余字段來應對,但這種設計顯然很糟。
如何能夠做到可擴展的數據結構設計呢?
不用修改表結構就能新增字段?可以的!許多NoSQL數據庫使用的列族(ColumnFamily)設計就是一個解決方案。列族最早在Google BigTable中使用,這是一種面向列族的稀疏矩陣存儲格式:
表中不同學生的聯系方式各不相同,選修課程也不同, 而且將來還會有更多聯系方式和課程加入到這張表里,如果按照傳統的關系數據庫設計,無論提前預設多少冗余字段都會捉襟見肘。
而使用支持列族結構的NoSQL數據庫,在創建表時,只需指定列族名字,無需指定字段(Column)。何時指定字段呢?可以在數據寫入時再指定。
這樣,數據表能包含數百萬的字段,可隨意擴展應用程序的數據結構。并且這種數據庫在查詢時也很方便,可以通過指定任意字段名稱和值進行查詢。
HBase這種列族的數據結構設計,實際上是把字段的名稱和字段的值,以KV形式一起存儲在HBase。實際寫入時,可隨意指定字段名稱,即使有幾百萬個字段也能輕松應對。
HBase的高性能存儲
傳統的機械式磁盤的訪問特性是連續讀寫很快,隨機讀寫很慢,因為機械磁盤靠電機驅動訪問磁盤上的數據,電機要將磁頭落到數據所在的磁道上,這個過程需要較長的尋址時間。如果數據不連續存儲,磁頭就要不停的移動,浪費大量時間。
為提高數據寫入速度,HBase使用一種叫作LSM樹的數據結構進行數據存儲。LSM樹的全名是Log Structed Merge Tree,翻譯過來就是Log結構合并樹。數據寫入的時候以Log方式連續寫入,然后異步對磁盤上的多個LSM樹進行合并。
LSM樹可看作是一個N階合并樹。數據寫操作(包括插入、修改、刪除)都在內存中進行,并且都會創建一個新記錄(修改會記錄新的數據值,而刪除會記錄一個刪除標志)。這些數據在內存中仍然還是一棵排序樹,當數據量超過設定的內存閾值后,會將這棵排序樹和磁盤上最新的排序樹合并。當這棵排序樹的數據量也超過設定閾值后,會和磁盤上下一級的排序樹合并。合并過程中,會用最新更新的數據覆蓋舊的數據(或者記錄為不同版本)。
在需要進行讀操作時,總是從內存中的排序樹開始搜索,如果沒有找到,就從磁盤 上的排序樹順序查找。
在LSM樹上進行一次數據更新無需磁盤訪問,在內存即可完成。當數據訪問以寫操作為主,而讀操作則集中在最近寫入的數據上時,使用LSM樹可極大減少磁盤訪問次數。
總結
HBase架構上通過數據分片的設計配合HDFS,實現數據的分布式海量存儲。
數據結構上通過列族,實現了數據表結構可以在運行期自定義存儲上通過LSM樹,使數據可通過連續寫磁盤的方式保存數據,極大提高數據寫入性能。
結合Apache開源社區,使得HBase在NoSQL競品中保持領先優勢,逐步成為NoSQL最具影響力產品。
HBase 數據庫
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。