數(shù)據(jù)模型
傳統(tǒng)的關(guān)系型數(shù)據(jù)庫,一張表(table)由行(row)和列(column)組成。相對Hbase分布式數(shù)據(jù)庫卻有所差別,可以把Hbase中的表理解成不同維度Map的集合。包含以下主要概念。
- table
hbase數(shù)據(jù)庫中的表。 - row
hbase數(shù)據(jù)庫表中的行。一張表包含多行。每一行由row key和一個或多個column的值組成。row key按字母表順序排序存儲。在設計表的row key時,推薦按業(yè)務含義把相近的內(nèi)容放到一起,這樣可以有效地提高查詢效率。比如:一張表的row key為domain(域名)時,對應row key值最好設計成域名的倒敘值(如:org.Apache.www, org.apache.mail, org.apache.jira),hbase存儲時就可以把相同根域名的值放到同一塊存儲區(qū)域中,查詢起來更快。row key不宜設計過大,hbase中每個值都會保存相關(guān)keys (row key, family qualifier, and timestamp)。
- column
hbase數(shù)據(jù)庫表中的列。列由列族(column family)和列修飾符(column qualifier)構(gòu)成。兩者通過':'符號分隔。
- column family
框架性能方面的考慮,列族在物理上是多個列以及列中的相應值的集合。列族中還會存儲一些基礎(chǔ)的元數(shù)據(jù),比如當前列族內(nèi)容是否需要緩存在內(nèi)存中,row key編碼規(guī)則,數(shù)據(jù)壓縮方式等。一張hbase表中的列族不宜過多,一般建議不超過3個,過多時在數(shù)據(jù)塊壓縮調(diào)整時會導致相互影響,從而影響性能。
- column qualifier
列修飾符被加入到某個列族中,并在列族中提供索引關(guān)聯(lián)列修飾符中的值。如:列族content中的html修飾符,表示content:html;另一個修飾符pdf,則表示content:pdf。
- cell
一個單元對應表中一行(row)中列族(column family)下某個列修飾符(column qualifier)的值,包含具體值和時間戳(timestamp),其中時間戳用來標識當前值所屬的版本(version)。
- timestamp
cell值被寫入時,附帶會寫入相應的timestamp時間,作為該值的一個版本信息。timestamp默認取當前RegionServer服務機器上的時間,當然你也可以自行指定時間值。
概念視圖
上面數(shù)據(jù)模型介紹的概念通過以下表格可以幫助理解。

將以上表格轉(zhuǎn)換成json格式

通過以上圖示,可以了解:
一個row key具有多個版本的數(shù)據(jù),不同版本通過不同的timestamp定義。
一個column family可以有多個column qualifier。
row key下的column family可以為空。
一個row key多版本數(shù)據(jù)按版本號時間倒序排列。當查詢條件不帶版本號時,以倒敘順序依次從上往下查找。如:rowkey="com.cnn.www",列族=contents:html,返回值t6版本的值。
NOSQL特性
hbase是一個nosql數(shù)據(jù)庫,相較于RDBMS,它不支持傳統(tǒng)關(guān)系型數(shù)據(jù)庫的typed columns(列類型), secondary indexes(二級索引), triggers(觸發(fā)器), and advanced query languages(高級查詢語言)等特性。它的長處在數(shù)據(jù)存儲,是真正意義上的分布式數(shù)據(jù)庫。通過添加RegionServer機器,即可實現(xiàn)hbase的線性和模塊化擴展。
Hbase具有以下特性:
- Strongly consistent reads/writes: HBase is not an "eventually consistent" DataStore. This makes it very suitable for tasks such as high-speed counter aggregation.(強一致讀寫,非最終一致性數(shù)據(jù)存儲,這使得特別適合高速的count聚合運算場景)。
- Automatic sharding: HBase tables are distributed on the cluster via regions, and regions are automatically split and re-distributed as your data grows.(自動分片:HBase表通過regions分布到集群的不同機器上,隨著數(shù)據(jù)增長,regions會自動分裂和重新分配集群機器資源)
- Automatic RegionServer failover(自動RegionServer故障切換)
- Hadoop/HDFS Integration: HBase supports HDFS out of the box as its distributed file system.(支持Hadoop和HDFS集成)
- MapReduce: HBase supports massively parallelized processing via MapReduce for using HBase as both source and sink.(支持MapReduce計算框架)
- JAVA Client API: HBase supports an easy to use Java API for programmatic access.(友好的java API集成)
- Thrift/REST API: HBase also supports Thrift and REST for non-Java front-ends.(友好的Thrift/REST API集成)
- Block Cache and Bloom Filters: HBase supports a Block Cache and Bloom Filters for high volume query optimization.(大容量查詢優(yōu)化,設計了塊緩存和布隆過濾)
- Operational Management: HBase provides build-in web-pages for operational insight as well as JMX metrics.(內(nèi)置可視化界面操作工具)
表物理存儲模型

HBase表中的數(shù)據(jù)被拆分成不同的區(qū)域塊(Region),每個區(qū)域塊按一定規(guī)則分發(fā)到集群中不同的RegionServer上。通過這種把大表中數(shù)據(jù)打散到集群節(jié)點存儲的方式來實現(xiàn)大數(shù)據(jù)寬表的線性擴展能力。
架構(gòu)

上圖Hbase總體架構(gòu)圖,包含了HMaster、HRegionServer、HRegion、Hlog、Store、MEMStore等邏輯結(jié)構(gòu)劃分。HBase以HDFS作為底層存儲框架,通過DFS Client進行文件操作。HMaster負責把HRegion分配給HRegionServer。一個HRegionServer包含多個HRegion。HRegionServer中的多個Region共享一個HLog,HLog用來做災備恢復。一個Region由一個或多個store組成,一個store對應表中的一個列族,每個store包含memStore和其對應的一個或多個StoreFile。StoreFile是HFile的輕量封裝,HFile是HDFS中的文件存儲格式,MemStore放在內(nèi)存中。
- Client
Client訪問在新版本中將不直接操作zookeeper,通過HMaster的RPC遠程端口間接獲取meta數(shù)據(jù)。Client獲得RegionServer Location后將直接對接RegionServer服務,無需經(jīng)過HMaster轉(zhuǎn)接。
- HMaster
HMaster主要功能:把HRegion分配到某一個RegionServer;有RegionServer宕機了,HMaster可以把這臺機器上的Region遷移到active的RegionServer上;對HRegionServer進行負載均衡;通過HDFS的dfs client接口回收垃圾文件(無效日志等)。 - HRegionServer
維護HMaster分配給它的HRegion,處理對這些HRegion的IO請求,也就是說客戶端直接和HRegionServer打交道;負責切分正在運行過程中變得過大的HRegion。
- HRegion
每個HRegion由多個Store構(gòu)成,每個Store保存一個列族(Columns Family),表有幾個列族,則有幾個Store,每個Store由一個MemStore和多個StoreFile組成,MemStore是放在內(nèi)存中的,寫到文件后就是StoreFile。StoreFile底層是以HFile的格式保存。
- HLog
HLog(WAL log):WAL意為write ahead log(預寫日志),用來做災難恢復使用,HLog記錄數(shù)據(jù)的變更,包括序列號和實際數(shù)據(jù),所以一旦region server 宕機,就可以從log中回滾還沒有持久化的數(shù)據(jù)。
- HFile
HBase的數(shù)據(jù)最終是以HFile的形式存儲在HDFS中的,HBase中HFile有著自己的格式。
小結(jié)
本文簡單介紹了Hbase分布式數(shù)據(jù)的數(shù)據(jù)模型、概念視圖、NOSQL特性、整體架構(gòu)內(nèi)容。對Hbase的一些關(guān)鍵概念有了初步認識,從整體上對框架有了全局的了解。
希望本文對初學HBase的讀者有所幫助,若有遺漏之處歡迎留言討論。