導讀:HBase是一個構(gòu)建在HDFS之上的、分布式的、支持多版本的NoSQL數(shù)據(jù)庫,它的出現(xiàn)補齊了大數(shù)據(jù)場景下快速查詢數(shù)據(jù)能力的短板。它非常適用于對平臺中的熱數(shù)據(jù)進行存儲并提供查詢功能。
作者:朱凱
來源:華章科技

01 概述
HBase的出現(xiàn)很好地彌補了大數(shù)據(jù)快速查詢能力的空缺。讓我們再次將時間撥回到2006年,那時Hadoop項目已經(jīng)正式啟動,開源社區(qū)已經(jīng)擁有了HDFS和MapReduce。通過HDFS我們擁有了能夠存儲海量文件的分布式文件系統(tǒng)。通過MapReduce我們擁有了一種對海量數(shù)據(jù)進行批處理操作的途徑。
但是這還不夠,我們在大數(shù)據(jù)領(lǐng)域還沒有一款能夠稱為數(shù)據(jù)庫的產(chǎn)品。就在2006年年末,google發(fā)表了著名的Bigtable論文。此后HBase便誕生了。
HBase是一個構(gòu)建在HDFS之上的、分布式的、支持多版本的NoSql數(shù)據(jù)庫。它也是Google BigTable的開源實現(xiàn)。HBase非常適合于對海量數(shù)據(jù)進行實時隨機讀寫。HBase中的一張表能夠支撐數(shù)十億行和數(shù)百萬列。
HBase從設(shè)計上來講是一個由三類服務(wù)組成的Master/Slave架構(gòu)服務(wù)。HBase Master進程負責處理Region分配、DDL(create、delete表)這類操。數(shù)據(jù)的讀寫由RegionServers進程負責處理。底層數(shù)據(jù)存儲和集群協(xié)同管理則交由HDFS和Zookeeper進行管理,如圖2-6所示。

▲圖2-6 HBase邏輯架構(gòu)圖
HBase的所有數(shù)據(jù)最終都以HDFS文件的形式進行存儲,Region Server服務(wù)通常是伴隨著HDFS的Datanode進行部署的,這樣可以更好地利用數(shù)據(jù)本地性的優(yōu)勢。
HBase采用主從架構(gòu)。其分布式協(xié)調(diào)是通過Zookeeper進行管理的,而數(shù)據(jù)的物理存儲最終會以文件的形式存儲到HDFS。
02 數(shù)據(jù)模型
HBase是一個NoSQL數(shù)據(jù)庫,它通過一個四維數(shù)據(jù)模型定義數(shù)據(jù),如圖2-7所示。
- RowKey:HBase中的每行數(shù)據(jù)都必須擁有一個唯一的行鍵,它類似于關(guān)系型數(shù)據(jù)庫中的主鍵。
- Column Family:HBase中的每個列都歸屬于一個列簇,它類似于子表的概念。一個列簇對應一個MemStore對象。
- Column:HBase用列來定義數(shù)據(jù)屬性字段,和關(guān)系型數(shù)據(jù)庫中的表字段類似。
- Version:HBase中的數(shù)據(jù)是有版本概念的,每次新增或者修改數(shù)據(jù)都會產(chǎn)生一個新的版本。

▲圖2-7 HBase的四維數(shù)據(jù)模型
HBase的數(shù)據(jù)模型由行鍵、列簇、列名和版本號組成。
03 Regions
HBase的表以RowKey的起止區(qū)間為范圍被水平切分成了多個Region。每個Region中包含了RowKey從開始到結(jié)束區(qū)間的所有行。這些Region被分配到的集群節(jié)點稱為RegionServers,RegionServers負責提供HBase中數(shù)據(jù)的讀寫功能。一個RegionServer可以容納大約1000個Region,如圖2-8所示。

▲圖2-8 HBase Regions的邏輯結(jié)構(gòu)
一個Region Server包含了多個Region,每個Region包含了一部分數(shù)據(jù)。
04 HBase Master
HBase Master主要負責Region的分配和一些DDL操作,如圖2-9所示。HBase Master在啟動、失敗恢復或者負載均衡的時候為region指定所屬的RegionServer,或者是創(chuàng)建、刪除和更新表的這類操作。

▲圖2-9 HBase Master的邏輯結(jié)構(gòu)
HMaster作為主控節(jié)點并不直接存儲數(shù)據(jù),它只是做一些統(tǒng)籌分配和DDL操作。
05 Region Server
之前我們提到過,為了利用HDFS數(shù)據(jù)本地性的能力,通常會將RegionServer一同安裝在HDFS的Datanode所在的服務(wù)器之上,如圖2-10所示。RegionServer自身包含這么幾個部分:
- WAL:預寫日志是HDFS上的一個文件,它是一種容災策略。HBase為了提高寫入性能,在寫入數(shù)據(jù)的時候并不急于將數(shù)據(jù)保存到磁盤,而是將數(shù)據(jù)直接保留在內(nèi)存中。但是內(nèi)存中的數(shù)據(jù)并不是一直可靠的,所以HBase采用了預寫日志的方案。當有新數(shù)據(jù)寫入的時候,RegionServer先通過預寫日志的方式記錄數(shù)據(jù),同時將數(shù)據(jù)放入內(nèi)存對象MemStore中。當日志寫完之后就立刻返回客戶端告知寫入成功。
- BlockCache:數(shù)據(jù)塊緩存是一種讀緩存,客戶端讀取數(shù)據(jù)的時候會先從這個緩存中查找有沒相應的數(shù)據(jù)。塊數(shù)據(jù)緩存采用LRU失效策略。
- MemStore:MemStore是一種寫緩存,HBase為了提升寫入性能不會直接將數(shù)據(jù)刷入磁盤而是先使用MemStore內(nèi)存對象存儲數(shù)據(jù)。再通過一個守護線程定期將MemStore刷入磁盤。在一個region中每個列簇都擁有一個MemStore。
- Hfile:Hfile是HBase最終數(shù)據(jù)存儲的載體,它本質(zhì)上是HDFS上的一個文件。

▲圖2-10 Region Server的邏輯結(jié)構(gòu)
Region Server是HBase中真正存儲數(shù)據(jù)的地方,它主要由WAL、BlockCache、MemStore和HFile組成。
06 MemStore與HFile
為了提高數(shù)據(jù)寫入時的吞吐量,HBase并不會實時的將寫入的數(shù)據(jù)直接刷入磁盤,而是先將數(shù)據(jù)放入內(nèi)存中進行保管,MemStroe對象就是負責此項任務(wù)的邏輯對象,它將數(shù)據(jù)以Key-Values的形式保存在內(nèi)存中。
將數(shù)據(jù)直接放入內(nèi)存讀寫雖然很快,但這樣做并不安全,因為一旦服務(wù)器重啟數(shù)據(jù)便會全部丟失。所以HBase在此處設(shè)計了一種預寫日志結(jié)合MemStroe的方式來解決這個問題。
當客戶端向HBase發(fā)起一次寫入請求的時候,HBase首先會通過RegionServer將數(shù)據(jù)寫入預寫日志,之后再用MemStroe對象將數(shù)據(jù)保存到內(nèi)存之中。由于有了預寫日志,當服務(wù)出現(xiàn)故障重啟之后,Region可以通過日志將數(shù)據(jù)復原到MemStroe。
HBase的這種寫入策略極大地提升了其數(shù)據(jù)寫入的吞吐量,因為一旦寫入日志的動作完成了就算寫入數(shù)據(jù)成功。同時預寫日志是對磁盤文件的順序?qū)懭氩僮鳎鋵懭胨俣纫彩值难杆佟?/p>
但是,畢竟內(nèi)存空間是有限的,MemStroe不可能沒有限制的存儲數(shù)據(jù)。所以當一個MemStroe存儲的數(shù)據(jù)達到某個閾值的時候,HBase會將這個MemStroe的數(shù)據(jù)通過HFile的形式寫入磁盤并清空該MemStroe。
HFile是HBase最終存儲數(shù)據(jù)的載體,它本質(zhì)上對應的是HDFS的文件。因為HFile是以經(jīng)過排序的Key-Values對象的形式進行存儲的,所以它的在寫入文件的時候只需要采用順序?qū)懀瑢懭胨俣确浅?臁File的邏輯架構(gòu)如圖2-11所示。
07 使用場景
HBase由于它強大的存儲和查詢性能使得它在大數(shù)據(jù)領(lǐng)域成為一個多面手。
1. 平臺存儲
由于HBase構(gòu)建在HDFS之上,這意味著它能像HDFS一樣實現(xiàn)存儲的線性擴容。同時它又能提供毫秒級的查詢性能。所以它可以作為其他大數(shù)據(jù)組件的低層存儲支持。比如Apache Kylin就是使用HBase作為其數(shù)據(jù)索引的存儲載體。

▲圖2-11 Region Server的邏輯結(jié)構(gòu)
2. 應用存儲/緩存
由于HBase出色的寫入性能,它非常適合大規(guī)模數(shù)據(jù)的實時寫入場景。比如在流計算、用戶行為數(shù)據(jù)存儲等場景就非常適合用HBase進行存儲。
關(guān)于作者:朱凱,資深大數(shù)據(jù)專家和架構(gòu)師,擁有10年IT從業(yè)經(jīng)驗,精通大數(shù)據(jù)、JAVA、Node.JS等技術(shù)。對大數(shù)據(jù)領(lǐng)域的主流技術(shù)與解決方案有深入研究,擅長分布式系統(tǒng)的架構(gòu)設(shè)計與整合。曾主導過多款大數(shù)據(jù)平臺級產(chǎn)品的規(guī)劃設(shè)計與研發(fā)工作,一線實戰(zhàn)經(jīng)驗豐富。
本文摘編自《企業(yè)級大數(shù)據(jù)平臺構(gòu)建:架構(gòu)與實現(xiàn)》,經(jīng)出版方授權(quán)發(fā)布。