HBase的邏輯存儲結構主要包括:命名空間(NameSpace)、表(Table)和列族(Column Family)。視頻講解如下:
https://www.bilibili.com/video/BV1T3BrYcE8a/?aid=113529894410...
下面分別進行介紹。
一、 命名空間(NameSpace)
HBase的命名空間相當於Oracle和MySQL中的數據庫,它是對錶的邏輯劃分。不同的HBase命名空間類似於關係型數據庫中的不同的數據庫。利用命名空間的邏輯管理功能,可以實現在多租户場景下做到更好的資源和數據隔離。在系統表hbase:namespace中保存了的所有的命名空間信息。視頻講解如下:
https://www.bilibili.com/video/BV1nvBsY6EhX/?aid=113535631825...
通過下面的語句可以管理和操作HBase的命名空間。
(1)查詢系統表hbase:namespace
> scan 'hbase:namespace'
# 輸出的信息如下:
ROW COLUMN+CELL
default column=info:d, timestamp=1631601267690, value=\x0A\x07default
hbase column=info:d, timestamp=1631601267862, value=\x0A\x05hbase
2 row(s)
提示:這裏可以看出在默認的情況下,HBase存在兩個命名空間,即:default和hbase。如果沒有指定命名空間,新表將創建在default命名空間下;而hbase命名空間是系統命名空間,一般不用於普通操作。
(2)查看命名空間也可以通過執行list_namespace命令,例如:
> list_namespace
# 輸出的信息如下:
NAMESPACE
default
hbase
2 row(s)
(3)創建一個新的命名空間mydemo,並在mydemo命名空間中創建一張新表。
> create_namespace 'mydemo'
> create 'mydemo:table1','info'
(4)查看命名空間mydemo中的表。
> list_namespace_tables 'mydemo'
# 輸出的信息如下:
TABLE
table1
1 row(s)
二、 表(Table)
HBase的表對應於關係型數據庫中的一張表,HBase以表為單位組織數據,表由多行組成。每一行由一個RowKey和多個列族組成。Rowkey用於唯一標識一條記錄。不同行的Rowkey可以重複,但相同的Rowkey表示同一條記錄。為了加快查詢數據的速度,HBase表中的所有行都按照RowKey的字典順序進行排列。
視頻講解如下:
https://www.bilibili.com/video/BV1m5zKYNEQF/?aid=113543902928...
表在行的方向上分隔為多個Region,而Region是HBase中分佈式存儲和負載均衡的最小單元。因此在同一個Region Server上可能保存了不同的Region,但一個Region只會屬於一個Region Server。Region按大小分隔,而表中每一行只能屬於一個Region。隨着數據不斷插入表,會使得Region不斷增大。當Region中的某個列族達到一個閾值時就會分成兩個新的Region,分裂後每一個新的Region大小是原來Region的一半。
三、 列族(Column Family)
由於表中的一行上可能存在多個列族,因此Region可以被進一步地劃分。每一個Region有一個或多個Store組成,HBase會把一起訪問的數據放在一個Store裏面,即一行上有幾個列族,也就有幾個Store。一個Store由一個MemStore和多個Store File組成。
視頻講解如下:
https://www.bilibili.com/video/BV15hz3YfEfX/?aid=113549019976...
列族中包含列,列不需要事先創建。當插入數據時沒有該列,HBase會自動創建列;列又是由單元格組成。
提示:MemStore是HBase的寫緩存,用於保存修改的數據。當MemStore的大小達到一個閥值時,HBase會有一個線程來將MemStore中的數據刷新到HBase的數據文件中生成一個快照。這個快照就是Store File。