Hbase
Hbase是一種NoSql模式的資料庫,採用了列式儲存。而採用了列儲存天然具備以下優勢:
- 可只查涉及的列,且列可作為索引,相對高效
- 針對某一列的聚合及其方便
- 同一列的資料型別一致,方便壓縮
同時由於列式儲存將不同列分開儲存,也造成了讀取多列效率不高的問題
LSM Tree
說到HBase,我們不得不說其採用的LSM Tree。我們都知道關聯式資料庫中常用的B+Tree,葉子節點有序,但寫入時可能存在大量隨機寫入,因此形成了其讀快寫慢的特點。
而HBase採用了LSM Tree,在讀寫之間尋找了平衡,損失了部分讀取的效能,實現了快速的寫入。LSM具體實現如下:
- 寫入WAL日誌中(防止資料丟失),同時資料寫入記憶體中,記憶體中構建一個有順序的樹,HBase採用跳錶結構。
- 隨著記憶體中資料逐漸增大,記憶體中flush到磁碟,形成一個個小樹。
- 磁碟中的小樹存在資料冗餘,且查詢時遍歷多個小樹效率低,LSM定期合併,實現資料合併,而合併的時候,會對資料重新排序,優化讀取效能。
HBase架構
HBase中三個核心的Server形成其分散式儲存架構。
- RegionServer:負責客戶端讀寫請求,客戶端直接與其通訊
- HBaseMaser:負責維護RegionServer;表結構的維護
- Zookeeper:維護叢集狀態
HBase讀寫操作步驟
- 客戶端從zookeeper獲取哪臺RegionServer儲存MetaTable(一張特殊表,儲存了所有region資訊)。
- 客戶端查詢MetaTable所在的RegionServer,獲取哪臺RegionServer應負責此次操作的rowKey
- 客戶端訪問對應的RegionServer實現資料讀取
RegionServer的組成
- WAL:Write Ahead Log,用於儲存寫操作的日誌,用於故障恢復
- BlockCache:讀快取,用於快取最常訪問資料
- MemStore:寫快取,會定期flush到磁碟
- HFile:在HDFS上儲存資料,以有序keyvalue形式儲存
HBase儲存機制
- 表是行的集合。
- 行是列家族的集合。
- 列家族是列的集合。
- 列是鍵值對的集合。
HBase安裝
1.下載Hbase2.4.11
https://hbase.apache.org/downloads.html
2.解壓
tar -zxvf hbase-2.4.11-bin.tar.gz
3.修改環境變數
cat conf/hbase-env.sh export JAVA_HOME=/usr/local/java18/jdk1.8.0_331/
4.修改hbase儲存位置
cat conf/hbase-site.xml <property> <name>hbase.cluster.distributed</name> <value>true</value> </property> <property> <name>hbase.rootdir</name> <value>hdfs://localhost:9000/hbase</value> </property>
5.啟動Hbase
./bin/start-hbase.sh
6.驗證Hbase
http://192.168.43.50:16010/master-status
7.停止Hbase
./bin/stop-hbase.sh
HBase Shell訪問HBase
官方文件:https://hbase.apache.org/book.html#shell
1.進入shell
./bin/hbase shell
2.檢視錶
hbase:001:0> list
3.建立表
#create ‘<table name>’,’<column family>’ hbase:001:0> create 'emp', 'personal data', 'professional data' Created table emp Took 3.4810 seconds => Hbase::Table - emp
4.建立/更新資料
#put ‘table name’,’row ’,'Column family:column name',’new value’ hbase:001:0> put 'emp','1','personal data:name','raju' Took 1.1807 seconds
5.檢視資料
hbase:001:0> scan 'emp' ROW COLUMN+CELL 1 column=personal data:name, timestamp=2022-05-02T09:55:38.861, value=raju 1 row(s) Took 1.1758 seconds
#get ’<table name>’,’row1’ hbase:002:0> get 'emp', '1' COLUMN CELL personal data:name timestamp=2022-05-02T09:55:38.861, value=raju 1 row(s) Took 1.3090 seconds
6.刪除資料
#delete ‘<table name>’, ‘<row>’, ‘<column name >’, ‘<time stamp>’ hbase:001:0> deleteall 'emp','1' Took 0.9424 seconds
C#訪問Hbase
C#訪問Hbase可以根據thrift檔案自己生成響應rpc client程式碼,通過rpc方式訪問。
https://github.com/apache/hbase/tree/master/hbase-thrift/src/main/resources/org/apache/hadoop/hbase
也可以啟動rest server通過微軟的Microsoft.Hbase.Client訪問,我們這次使用rest方式訪問。
1.啟動與關閉rest server
./bin/hbase-daemon.sh start rest
./bin/hbase-daemon.sh stop rest
可通過訪問http://192.168.43.50:8080/version/cluster驗證rest是否啟動成功
2.新增console專案,引入Microsoft.Hbase.Client包
https://github.com/hdinsight/hbase-sdk-for-net
3.編寫測試demo
using Microsoft.HBase.Client; using Microsoft.HBase.Client.LoadBalancing; using org.apache.hadoop.hbase.rest.protobuf.generated; var scanOptions = RequestOptions.GetDefaultOptions(); scanOptions.Port = 8080; scanOptions.AlternativeEndpoint = "/"; var nodeIPs = new List<string>(); nodeIPs.Add("192.168.43.50"); var client = new HBaseClient(null, scanOptions, new LoadBalancerRoundRobin(nodeIPs)); var version = client.GetVersionAsync().Result; Console.WriteLine(version); var testTableSchema = new TableSchema(); testTableSchema.name = "mytablename"; testTableSchema.columns.Add(new ColumnSchema() { name = "d" }); testTableSchema.columns.Add(new ColumnSchema() { name = "f" }); client.CreateTableAsync(testTableSchema).Wait();
通過hbase shell驗證表是mytablename否建立成功
hbase:001:0> list TABLE emp mytablename