基本概念
hbase使用hdfs存儲數據,使用zookeeper進行協調管理
column family(列族)
列族是表的垂直切分
所謂列族就是把列(column)分組,按需查找,為了解決大寬表問題
即不通的列族存儲在不同的文件中,可以減少磁盤IO,提高查詢效率
列族中的列是動態(tài)的,可以隨時添加,但是列族是靜態(tài)的,一旦創(chuàng)建就不能刪除
rowKey
rowKey是表的水平切分
每一行有個rowKey,其實就是主鍵,可以按照rowKey進行分區(qū)
即不同的row數據分布在不通的Region
存儲結構
上面的基礎概念并不很直觀,下面通過一個例子來說明hbase的存儲結構,為了清晰,會忽略部分細節(jié),并不完全嚴謹
邏輯結構
假設現在有個用戶表,包含兩個列族info和address
其中info包含name和age,address包含city和street,此時有三條數據,他們的邏輯結構如下:
| rowKey | Column Family: info | Column Family:address |
|---|---|---|
| 1 | name:張三,age:18 | city:北京,street:北京街 |
| 2 | name:李四,age:19 | city:天津,street:天津街 |
| 3 | name:王五,age:20 | city:上海,street:上海街 |
物理結構
hbase是KV數據庫,一個單元格可以當成一個value,key的組成是rowKey/column family/column/timestamp
timestamp是時間戳,可以用來做版本控制,如果不指定,默認是當前時間戳
繼續(xù)上一個例子,假設按rowKey按奇偶分區(qū),hbase的物理結構可簡單的描述如下:

總結
通過上圖可以很直觀的看清hbase是如何存儲數據的,簡單概括如下
- 通過rowKey進行水平分區(qū),將數據存儲在不同的Region中
- 在一個Region中,通過column family進行垂直切分,將不同的列族存儲在不同的文件中
- 在一個文件中,每個單元格可以看作一行數據,分為key和value,key是單元格的橫縱坐標,value是單元格值
第3條實際上是一個單元格的一個版本可以看作一行數據,key除了橫縱坐標還有時間戳,所以一個單元格可以有多個版本
事務
hbase是強一致性的
hbase支持事務有限,只支持行級事務,不支持跨行事務
hbase可以使用check and set 進行單行原子操作,即CAS操作
集群
Master節(jié)點
負責管理Region服務器(RegionServer), 包括Region的分配、負載均衡等。
不參與具體的讀寫操作,主要負責元數據管理和集群監(jiān)控。
支持主備切換(通過Zookeeper實現高可用)。
RegionServer節(jié)點
負責實際的數據存儲和讀寫操作。
每個RegionServer管理多個Region,每個Region是一個表的一部分。
RegionServer會定期向Master匯報狀態(tài)。
Zookeeper
提供分布式協調服務,用于管理集群的狀態(tài)信息。
存儲HBase的元數據(如表結構、Region分布等)。
實現Master的高可用性和Region的動態(tài)分配。
HDFS
HBase將數據存儲在HDFS中,以保證數據的可靠性和高可用性。
數據以文件的形式存儲在HDFS上,每個Region對應一個或多個HDFS文件。
分析
- hbase首先是一個大數據數據庫,所以分布式存儲,并且支持水平擴展,這些就不用多說了
- hbase是一個KV數據庫,所以擅長隨機讀寫,但是不支持復雜查詢
- hbase是一個列族數據庫,所以擅長大寬表
- hbase是一個強一致性數據庫,并支持行級事務
- hbase不需要提前定義列,所以支持動態(tài)列,適合存儲稀疏數據