什么是HBase
Apache HBase是運行在Hadoop集群上的數(shù)據(jù)庫梭纹。為了實現(xiàn)更好的課伸展性(scalability)变抽,HBase放松了對ACID(數(shù)據(jù)庫的原子性,一致性绍载,隔離性和持久性)击儡。因此HBase并不是一個傳統(tǒng)的關系型數(shù)據(jù)庫。另外阳谍,與關系型數(shù)據(jù)庫不同的是,存儲在HBase中的數(shù)據(jù)也不需要遵守某種嚴格的集合格式鸽疾,這使得HBase是用來存儲結構不嚴格的數(shù)據(jù)的理想工具训貌。
HBase在大數(shù)據(jù)應用的架構中應用非常廣泛递沪。但是基于其與關系型數(shù)據(jù)庫迥異的設計模式,實現(xiàn)這些應用也與基于關系型數(shù)據(jù)庫來實現(xiàn)非常不同款慨。下文將會對比HBase和關系型數(shù)據(jù)庫檩奠,并淺析HBase的特性。
關系型數(shù)據(jù)庫與HBase的對比
首先我們要明白在已經(jīng)存在關系型數(shù)據(jù)庫的情況下圣猎,為什么產(chǎn)生了所謂的NoSQL/HBase這樣的費關系型數(shù)據(jù)庫乞而?要解答這個問題,我們需要先了解一下關系型數(shù)據(jù)庫的優(yōu)勢和缺點欠啤。
- 關系型數(shù)據(jù)庫提供了標準的數(shù)據(jù)持久性模型
- SQL語言是事實上的數(shù)據(jù)操作標準語言
- 關系型數(shù)據(jù)庫內置了并發(fā)數(shù)據(jù)操作的管理機制
- 關系型數(shù)據(jù)庫提供全面的數(shù)據(jù)操作工具
關系型數(shù)據(jù)庫是長期以來數(shù)據(jù)存儲的標準工具洁段,那么我們?yōu)槭裁催€在尋找新的數(shù)據(jù)存儲方法呢?原因是現(xiàn)在需要存儲的數(shù)據(jù)越來越多祠丝,工業(yè)界對數(shù)據(jù)存儲工具可伸展性的要求也越來越高写半。一種簡單直接的擴展方法是垂直擴展,也就是采用更大更高效的服務器來存儲璃岳。但是這種方法成本很高悔捶,且可擴展性存在一個上限(單臺服務器的性能是有限的)。
關系型數(shù)據(jù)庫的局限性
除垂直擴展之外犁柜,我們也可以采用水平擴展的方法蛇损。也就是用服務器集群來滿足要求坛怪。用來集群的服務器可以是性能普通的服務器袜匿。這樣就可以大大降低運營成本。如果我們要采用水平擴展的方法來擴展關系型數(shù)據(jù)庫祭务,關系型數(shù)據(jù)庫中的數(shù)據(jù)勢必要根據(jù)row key分布存儲怪嫌,也就意味著某些row key對應的行存儲在某一臺服務器上,另一些row key對應的行存儲在另一臺服務器上拌倍。然而,要分割一個關系型數(shù)據(jù)庫是非常復雜的数初,并且關系型數(shù)據(jù)庫不具備自動分布式存儲的功能梗顺。不僅如此,分布存儲關系型數(shù)據(jù)庫仑鸥,我們將失去總體上的數(shù)據(jù)庫查詢功能及事務(transaction)的一致性矗漾。總而言之泵琳,關系型數(shù)據(jù)庫是為在單臺服務器上運行而設計的誊役。
除此之外蛔垢,關系型數(shù)據(jù)庫中數(shù)據(jù)庫規(guī)范化(database normalization)的理念消除了數(shù)據(jù)的重復存儲,使得數(shù)據(jù)存儲更高效巩梢。在查詢時為了將數(shù)據(jù)重新組織起來艺玲,就需要需要Join操作。這也進一步使得關系型數(shù)據(jù)庫的分布式存儲更為困難忌警。
HBase的高效秒梳,分布式,可擴展性的設計理念
由于HBase在設計上不支持關系和Join這樣的概念朋譬,需要一起查詢的數(shù)據(jù)就被存在一起兴垦。因此也就避免了關系型數(shù)據(jù)庫的一些局限性。下圖表現(xiàn)了HBase和關系型數(shù)據(jù)庫在數(shù)據(jù)存儲模型上的不同犀忱。
由于HBase將所有需要一起查詢到數(shù)據(jù)存儲在一起這一特性阴汇,HBase集群就自然能夠根據(jù)key來組織數(shù)據(jù)。在水平分割的時候拐纱,key值的范圍就可以被用來分割數(shù)據(jù)哥倔。每一個服務器存儲全部數(shù)據(jù)的一個子集。同時分布式的數(shù)據(jù)還可以被同時訪問东抹。這大大增強了HBase的可擴展性沃测。HBase實際上是Google Big Table的一個實現(xiàn)。Big Table是Google提出的一個用來存儲大規(guī)模數(shù)據(jù)的一個分布式系統(tǒng)馏谨。
HBase是基于Column family data store的理念設計的:每一行根據(jù)一個row key索引附迷。也就是我們用來查詢的主鍵喇伯。同時每一行中有若干column family。每一個column family中有若干相關的column管宵。如下圖所示攀甚。
HBase中的row key也是HBase分布式存儲數(shù)據(jù)的主要根據(jù)岗喉。在分布存儲數(shù)據(jù)的時候钱床,根據(jù)row key值的范圍,每一臺服務器存儲全部數(shù)據(jù)的一個子集事期。HBase提供基于行的原子性操作保證。也就是每一個row key對應的行為一個原子操作的單元绎橘。
HBase的數(shù)據(jù)模型
HBase中的數(shù)據(jù)根據(jù)row key分布唠倦。row key類似于關系型數(shù)據(jù)庫中的主鍵(primary key)。HBase中的數(shù)據(jù)記錄根據(jù)row key的值排序冈止。這是HBase數(shù)據(jù)存儲的一個重要原則候齿,也是HBase設計架構的一個重要部分慌盯。
HBase中數(shù)據(jù)表根據(jù)row key的值分割為不同的區(qū)域,每個區(qū)域包含一部分連續(xù)的行诗眨。這些區(qū)域被分配給集群中不同的稱為區(qū)域服務器的數(shù)據(jù)結點孕讳〕Р疲可擴展性就是通過將區(qū)域分配給集群中的不同服務器實現(xiàn)的。這一操作是自動進行的璃饱。也就是HBase如何根據(jù)水平擴展設計的荚恶。
下圖表示了column family是如何映射到存儲文件的。不同的Column family被存儲在不同的文件中食寡。這些文件可以被分別訪問廓潜。
數(shù)據(jù)存儲在HBase表格的cell中。cell中包含key和value以及一些其他的信息(如version, type等)移盆。其中key部分包括row key伤为,column family,column qualifier, timestamp剑鞍。并且對于每一個值爽醋,key部分都會與其一同被存儲。如下圖所示光戈。
從邏輯上來看久妆,row似乎是以表格的形式存儲的跷睦。但事實上,row是以一些cell的集合的形式存儲的烂琴。其所對應的每一個cell都存儲了其所對應的上述所有key信息蜕乡。
下圖中上半部分是HBase的數(shù)據(jù)的邏輯布局,下半部分是文件的物理布局号醉。Column family被分別存儲于不同的文件中辛块。我們每設置一個值憨降,其對應的cell就會存儲所有的key信息(row key, column family, column qualifier, timestamp)该酗。
綜上所述士嚎,對于HBase中每一個cell的值悔叽,其完整的索引應當是Table::Row::Column family::Column::Timestamp --> Value。Hbase的表是稀疏的笨蚁。如果某一列沒有數(shù)據(jù)趟庄,則其不會被存儲。表中的cell有其對應的連續(xù)改變的version奋单。version默認參考timestamp猫十,但我們也可以自己定制。對于每一個Table::Row::Column family::Column --> Value贷笛,數(shù)據(jù)庫中可能存儲了多個不同version的值宙项。
Version系統(tǒng)是HBase自動采用的尤筐。從CRUD的角度來說,一個put操作既是插入(insert/create)拢驾,也是更新(Update)操作改基,每一個數(shù)據(jù)都會帶有其相應的version。Delete操作并不會立即在物理上刪除數(shù)據(jù)稠腊,而是會給數(shù)據(jù)加一個刪除標簽鸣哀。這個標簽會保證數(shù)據(jù)不會在查詢時被返回我衬。Get操作根據(jù)給定的參數(shù)返回特定version的數(shù)據(jù)饰恕。默認情況下最新版本的數(shù)據(jù)將會被返回井仰。保存在HBase中的同一個數(shù)據(jù)的不同version的數(shù)量也可以配置俱恶。這個數(shù)量是針對同一個column family而言的。默認情況下了罪,HBase會保存3個不同version的數(shù)據(jù)聪全。當數(shù)據(jù)不同的version數(shù)目超過這個數(shù)字時,最早version的數(shù)據(jù)將會被刪除吱七。
原文鏈接:HBase and MapR-DB: Designed for Distribution, Scale, and Speed
All rights reserved to the original author of the article.