導讀:HBase是一個構建在HDFS之上的、分布式的、支持多版本的NoSQL數據庫,它的出現補齊了大數據場景下快速查詢數據能力的短板。它非常適用于對平臺中的熱數據進行存儲并提供查詢功能。
作者:朱凱
來源:華章科技
01 概述
HBase的出現很好地彌補了大數據快速查詢能力的空缺。讓我們再次將時間撥回到2006年,那時Hadoop項目已經正式啟動,開源社區已經擁有了HDFS和MapReduce。通過HDFS我們擁有了能夠存儲海量文件的分布式文件系統。通過MapReduce我們擁有了一種對海量數據進行批處理操作的途徑。
但是這還不夠,我們在大數據領域還沒有一款能夠稱為數據庫的產品。就在2006年年末,google發表了著名的Bigtable論文。此后HBase便誕生了。
HBase是一個構建在HDFS之上的、分布式的、支持多版本的NoSql數據庫。它也是Google BigTable的開源實現。HBase非常適合于對海量數據進行實時隨機讀寫。HBase中的一張表能夠支撐數十億行和數百萬列。
HBase從設計上來講是一個由三類服務組成的Master/Slave架構服務。HBase Master進程負責處理Region分配、DDL(create、delete表)這類操。數據的讀寫由RegionServers進程負責處理。底層數據存儲和集群協同管理則交由HDFS和Zookeeper進行管理,如圖2-6所示。
▲圖2-6 HBase邏輯架構圖
HBase的所有數據最終都以HDFS文件的形式進行存儲,Region Server服務通常是伴隨著HDFS的Datanode進行部署的,這樣可以更好地利用數據本地性的優勢。
HBase采用主從架構。其分布式協調是通過Zookeeper進行管理的,而數據的物理存儲最終會以文件的形式存儲到HDFS。
02 數據模型
HBase是一個NoSQL數據庫,它通過一個四維數據模型定義數據,如圖2-7所示。
- RowKey:HBase中的每行數據都必須擁有一個唯一的行鍵,它類似于關系型數據庫中的主鍵。
- Column Family:HBase中的每個列都歸屬于一個列簇,它類似于子表的概念。一個列簇對應一個MemStore對象。
- Column:HBase用列來定義數據屬性字段,和關系型數據庫中的表字段類似。
- Version:HBase中的數據是有版本概念的,每次新增或者修改數據都會產生一個新的版本。
▲圖2-7 HBase的四維數據模型
HBase的數據模型由行鍵、列簇、列名和版本號組成。
03 Regions
HBase的表以RowKey的起止區間為范圍被水平切分成了多個Region。每個Region中包含了RowKey從開始到結束區間的所有行。這些Region被分配到的集群節點稱為RegionServers,RegionServers負責提供HBase中數據的讀寫功能。一個RegionServer可以容納大約1000個Region,如圖2-8所示。
▲圖2-8 HBase Regions的邏輯結構
一個Region Server包含了多個Region,每個Region包含了一部分數據。
04 HBase Master
HBase Master主要負責Region的分配和一些DDL操作,如圖2-9所示。HBase Master在啟動、失敗恢復或者負載均衡的時候為region指定所屬的RegionServer,或者是創建、刪除和更新表的這類操作。
▲圖2-9 HBase Master的邏輯結構
HMaster作為主控節點并不直接存儲數據,它只是做一些統籌分配和DDL操作。
05 Region Server
之前我們提到過,為了利用HDFS數據本地性的能力,通常會將RegionServer一同安裝在HDFS的Datanode所在的服務器之上,如圖2-10所示。RegionServer自身包含這么幾個部分:
- WAL:預寫日志是HDFS上的一個文件,它是一種容災策略。HBase為了提高寫入性能,在寫入數據的時候并不急于將數據保存到磁盤,而是將數據直接保留在內存中。但是內存中的數據并不是一直可靠的,所以HBase采用了預寫日志的方案。當有新數據寫入的時候,RegionServer先通過預寫日志的方式記錄數據,同時將數據放入內存對象MemStore中。當日志寫完之后就立刻返回客戶端告知寫入成功。
- BlockCache:數據塊緩存是一種讀緩存,客戶端讀取數據的時候會先從這個緩存中查找有沒相應的數據。塊數據緩存采用LRU失效策略。
- MemStore:MemStore是一種寫緩存,HBase為了提升寫入性能不會直接將數據刷入磁盤而是先使用MemStore內存對象存儲數據。再通過一個守護線程定期將MemStore刷入磁盤。在一個region中每個列簇都擁有一個MemStore。
- Hfile:Hfile是HBase最終數據存儲的載體,它本質上是HDFS上的一個文件。
▲圖2-10 Region Server的邏輯結構
Region Server是HBase中真正存儲數據的地方,它主要由WAL、BlockCache、MemStore和HFile組成。
06 MemStore與HFile
為了提高數據寫入時的吞吐量,HBase并不會實時的將寫入的數據直接刷入磁盤,而是先將數據放入內存中進行保管,MemStroe對象就是負責此項任務的邏輯對象,它將數據以Key-Values的形式保存在內存中。
將數據直接放入內存讀寫雖然很快,但這樣做并不安全,因為一旦服務器重啟數據便會全部丟失。所以HBase在此處設計了一種預寫日志結合MemStroe的方式來解決這個問題。
當客戶端向HBase發起一次寫入請求的時候,HBase首先會通過RegionServer將數據寫入預寫日志,之后再用MemStroe對象將數據保存到內存之中。由于有了預寫日志,當服務出現故障重啟之后,Region可以通過日志將數據復原到MemStroe。
HBase的這種寫入策略極大地提升了其數據寫入的吞吐量,因為一旦寫入日志的動作完成了就算寫入數據成功。同時預寫日志是對磁盤文件的順序寫入操作,其寫入速度也十分的迅速。
但是,畢竟內存空間是有限的,MemStroe不可能沒有限制的存儲數據。所以當一個MemStroe存儲的數據達到某個閾值的時候,HBase會將這個MemStroe的數據通過HFile的形式寫入磁盤并清空該MemStroe。
HFile是HBase最終存儲數據的載體,它本質上對應的是HDFS的文件。因為HFile是以經過排序的Key-Values對象的形式進行存儲的,所以它的在寫入文件的時候只需要采用順序寫,寫入速度非常快。HFile的邏輯架構如圖2-11所示。
07 使用場景
HBase由于它強大的存儲和查詢性能使得它在大數據領域成為一個多面手。
1. 平臺存儲
由于HBase構建在HDFS之上,這意味著它能像HDFS一樣實現存儲的線性擴容。同時它又能提供毫秒級的查詢性能。所以它可以作為其他大數據組件的低層存儲支持。比如Apache Kylin就是使用HBase作為其數據索引的存儲載體。
▲圖2-11 Region Server的邏輯結構
2. 應用存儲/緩存
由于HBase出色的寫入性能,它非常適合大規模數據的實時寫入場景。比如在流計算、用戶行為數據存儲等場景就非常適合用HBase進行存儲。
關于作者:朱凱,資深大數據專家和架構師,擁有10年IT從業經驗,精通大數據、JAVA、Node.JS等技術。對大數據領域的主流技術與解決方案有深入研究,擅長分布式系統的架構設計與整合。曾主導過多款大數據平臺級產品的規劃設計與研發工作,一線實戰經驗豐富。
本文摘編自《企業級大數據平臺構建:架構與實現》,經出版方授權發布。






