天天看點

Hadoop(四)C#操作Hbase

Hbase

Hbase是一種NoSql模式的資料庫,采用了列式存儲。而采用了列存儲天然具備以下優勢:

  1. 可隻查涉及的列,且列可作為索引,相對高效
  2. 針對某一列的聚合及其友善
  3. 同一列的資料類型一緻,友善壓縮

同時由于列式存儲将不同列分開存儲,也造成了讀取多列效率不高的問題

LSM Tree

說到HBase,我們不得不說其采用的LSM Tree。我們都知道關系資料庫中常用的B+Tree,葉子節點有序,但寫入時可能存在大量随機寫入,是以形成了其讀快寫慢的特點。

而HBase采用了LSM Tree,在讀寫之間尋找了平衡,損失了部分讀取的性能,實作了快速的寫入。LSM具體實作如下:

  1. 寫入WAL日志中(防止資料丢失),同時資料寫入記憶體中,記憶體中建構一個有順序的樹,HBase采用跳表結構。
  2. 随着記憶體中資料逐漸增大,記憶體中flush到磁盤,形成一個個小樹。
  3. 磁盤中的小樹存在資料備援,且查詢時周遊多個小樹效率低,LSM定期合并,實作資料合并,而合并的時候,會對資料重新排序,優化讀取性能。
Hadoop(四)C#操作Hbase

HBase架構

HBase中三個核心的Server形成其分布式存儲架構。

  1. RegionServer:負責用戶端讀寫請求,用戶端直接與其通信
  2. HBaseMaser:負責維護RegionServer;表結構的維護
  3. Zookeeper:維護叢集狀态
Hadoop(四)C#操作Hbase

HBase讀寫操作步驟

  1. 用戶端從zookeeper擷取哪台RegionServer存儲MetaTable(一張特殊表,存儲了所有region資訊)。
  2. 用戶端查詢MetaTable所在的RegionServer,擷取哪台RegionServer應負責此次操作的rowKey
  3. 用戶端通路對應的RegionServer實作資料讀取
Hadoop(四)C#操作Hbase

RegionServer的組成

  1. WAL:Write Ahead Log,用于存儲寫操作的日志,用于故障恢複
  2. BlockCache:讀緩存,用于緩存最常通路資料
  3. MemStore:寫緩存,會定期flush到磁盤
  4. HFile:在HDFS上存儲資料,以有序keyvalue形式存儲
Hadoop(四)C#操作Hbase

HBase存儲機制

  1. 表是行的集合。
  2. 行是列家族的集合。
  3. 列家族是列的集合。
  4. 列是鍵值對的集合。
Hadoop(四)C#操作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           

複制

複制

Hadoop(四)C#操作Hbase

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是否啟動成功

Hadoop(四)C#操作Hbase

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           

複制