Hbase列式存儲入門教程
HBase是一種分佈式、可擴展、支持海量數據存儲的NoSQL數據庫。分佈式是因為HBase底層使用HDFS存儲數據,可擴展也是基於HDFS的橫向擴展能力,作為大數據的存儲當然支持海量數據的存儲,NoSQL非關系型數據庫表結構和關系型數據庫(如Mysql)的邏輯結構、物理結構很不一樣,性質特點、應用場景也不一樣。
1、邏輯結構
1)Name Space
命名空間,類似於關系型數據庫的 DatabBase 概念,每個命名空間下有多個表。HBase有兩個自帶的命名空間,分別是 hbase 和 default,hbase 中存放的是 HBase 內置的表,default 表是用戶默認使用的命名空間。
2)Region
類似於關系型數據庫的表概念。不同的是,HBase 定義表時隻需要聲明列族即可,不需要聲明具體的列。這意味著,往 HBase 寫入數據時,字段可以動態、按需指定。因此,和關系型數據庫相比,HBase 能夠輕松應對字段變更的場景。
3)Row
HBase 表中的每行數據都由一個 RowKey 和多個 Column(列)組成,數據是按照 RowKey的字典順序存儲的,並且查詢數據時隻能根據 RowKey 進行檢索,所以 RowKey 的設計十分重要。
4)Column
HBase 中的每個列都由 Column Family(列族)和 Column Qualifier(列限定符)進行限定,例如 info:name,info:age。建表時,隻需指明列族,而列限定符無需預先定義。
5)Time Stamp
用於標識數據的不同版本(version),每條數據寫入時,如果不指定時間戳,系統會自動為其加上該字段,其值為寫入 HBase 的時間。
6)Cell
由{rowkey, column Family:column Qualifier, time Stamp} 唯一確定的單元。cell 中的數據是沒有類型的,全部是字節碼形式存貯。
2、物理結構
1)Region Server
Region Server 為 Region 的管理者,其實現類為 HRegionServer,主要作用如下:對於數據的操作:get, put, delete;對於 Region 的操作:splitRegion、compactRegion。
2)Master
Master 是所有 Region Server 的管理者,其實現類為 HMaster,主要作用如下:對於表的操作:create, delete, alter對於 RegionServer的操作:分配 regions到每個RegionServer,監控每個 RegionServer的狀態,負載均衡和故障轉移。
3)Zookeeper
HBase 通過 Zookeeper 來做 Master 的高可用、RegionServer 的監控、元數據的入口以及集群配置的維護等工作。
4)HDFS
HDFS 為 HBase 提供最終的底層數據存儲服務,同時為 HBase 提供高可用的支持。
3、增刪改查
初學或者測試階段對HBase操作可以使用HBase shell
。增刪改查等基本命令如下:
(1)創建表
create 'test','cf'
test是表名,cf是列族名,你會發現HBase的表在新建的時候並沒有地方讓你定義列(和關系型數據庫很不一樣吧)。這是因為HBase中的列全部都是靈活的,可以隨便定義的。列隻有在你插入第一條數據的時候才會生成。那麼表的屬性在哪裡定義呢?其實HBase的所有數據屬性都是定義在列族上的。
(2)查看表屬性
describe 'test'
輸出:
hbase(main):002:0> desc ‘test’
Table test is ENABLED
test, {TABLE_ATTRIBUTES => {DURABILITY => ‘USE_DEFAULT’, METADATA => {‘IS_ROOT’
=> ‘false’, ‘LINDORM_TABLE_ATTRS’ => ‘\x00\x08\x00\x00\x00\x16WAL_EDIT_WITH_FULL
_ROW\x05false\x00\x00\x00\x0BCONSISTENCY\x08eventual\x00\x00\x00\x16LEADER_BALAN
CE_ENABLED\x01\xFF\x00\x00\x00\x1FFULL_ROW_EDIT_CARRY_LATEST_DATA\x04true\x00\x0
0\x00\x0FDYNAMIC_COLUMNS\x04true\x00\x00\x00\x0FALLOW_FILTERING\x01\x00\x00\x00\
x00\x13LEADER_BALANCE_TYPE\x06single\x00\x00\x00\x12DEFERRED_LOG_FLUSH\x05false’
, ‘TABLEMETAVERSION’ => ‘`\xE4n\x0F’}}
COLUMN FAMILIES DESCRIPTION
{NAME => ‘cf’, VERSIONS => ‘1’, EVICT_BLOCKS_ON_CLOSE => ‘false’, NEW_VERSION_BE
HAVIOR => ‘false’, KEEP_DELETED_CELLS => ‘FALSE’, CACHE_DATA_ON_WRITE => ‘false’
, DATA_BLOCK_ENCODING => ‘DIFF’, TTL => ‘FOREVER’, MIN_VERSIONS => ‘0’, REPLICAT
ION_SCOPE => ‘0’, BLOOMFILTER => ‘ROW’, CACHE_INDEX_ON_WRITE => ‘false’, IN_MEMO
RY => ‘false’, CACHE_BLOOMS_ON_WRITE => ‘false’, PREFETCH_BLOCKS_ON_OPEN => ‘fal
se’, COMPRESSION => ‘ZSTD’, BLOCKCACHE => ‘true’, BLOCKSIZE => ‘65536’, METADATA
=> {‘STORAGE_POLICY’ => ‘DEFAULT’, ‘COMPRESS_TAGS’ => ‘true’, ‘DFS_REPLICATION’
=> ‘2’, ‘CHS_PROMOTE_ON_MAJOR’ => ‘true’}}
1 row(s)
Took 0.2150 seconds
可以看出對表的描述不多,大量的是對列族的描述,列族更像是傳統關系數據庫中的表,而表本身反倒變成隻是存放列族的空殼瞭。
(3)查看表
list
輸出:
hbase(main):001:0> list
TABLE
test
test1
test2
test_ls
4 row(s)
Took 0.6370 seconds
=> [“test”, “test1”, “test2”, “test_ls”]
(4)插入數據
put 'test','row1','cf:name','jack'
這條語句的意思就是:往test表插入一個單元格。這個單元格的rowkey為row1,也就是說它是屬於row1這個行中的一個列。該單元格的列族為cf。該單元格的列名為name。數據值為jack。可見列是在插入數據的時候產生的,Hbase中列可以自由擴展。表的結構中某一行可能沒有某個列,但數據並不以NULL替代,而是壓根沒有該單元格。這樣以稀疏k-v方式存儲數據可以大大壓縮數據存儲容量。
(5)掃描數據
scan 'test'
輸出:
hbase(main):011:0> scan ‘test’
ROW COLUMN+CELL
row1 column=cf:name, timestamp=1625911358767, value=jack
1 row(s)
Took 0.5670 seconds
scan命令類似於Mysql中的select * from test
。
(6)查看數據
scan命令是批量讀取數據,查詢某個單元格的數據可以用get命令,
get 'test','row1','cf:name'
由於HBase底層使用鍵值對存儲數據,查詢一個單元格的數據非常快,這和Mysql也完全不同。
(7)刪除數據
delete 'test','row1','cf:name'
HBase刪除記錄並不是真的刪除瞭數據,而是放置瞭一個墓碑標記(tombstone marker),把這個版本連同之前的版本都標記為不可見瞭。
(8)停用表
disable 'test'
表刪除之前要停用表
(9)刪除表
drop 'test'
4、應用場景
HBase采用的是Key/Value的存儲方式,這意味著,即使隨著數據量增大,也幾乎不會導致查詢的性能下降。凡事都不可能隻有優點而沒有缺點。數據分析是HBase的弱項,因為對於HBase乃至整個NoSQL生態圈來說,基本上都是不支持表關聯的。
不適用的場景:主要需求是數據分析,比如做報表。單表數據量不超過千萬。建議使用MySQL或者Oracle數據庫。
適用的場景:單表數據量超千萬,而且並發還挺高。數據分析需求較弱,或者不需要那麼靈活或者實時。
5、參考資料
《HBase不睡覺書》
《HBase原理與實踐》
B站視頻《尚矽谷HBase教程(hbase框架快速入門)》
到此這篇關於Hbase列式存儲入門的文章就介紹到這瞭,更多相關Hbase列式存儲內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- 詳解HBase表的數據模型
- Linux下Hbase安裝配置教程
- SpringBoot整合Hbase的實現示例
- Prometheus監控實戰篇Nginx、Hbase操作詳解
- 通過DBeaver連接Phoenix操作hbase的方法