Hadoop(四)C#操作Hbase

来源:https://www.cnblogs.com/chenyishi/archive/2022/05/02/16216585.html
-Advertisement-
Play Games

Hbase Hbase是一種NoSql模式的資料庫,採用了列式存儲。而採用了列存儲天然具備以下優勢: 可只查涉及的列,且列可作為索引,相對高效 針對某一列的聚合及其方便 同一列的數據類型一致,方便壓縮 同時由於列式存儲將不同列分開存儲,也造成了讀取多列效率不高的問題 LSM Tree 說到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定期合併,實現數據合併,而合併的時候,會對數據重新排序,優化讀取性能。

HBase架構

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

  1. RegionServer:負責客戶端讀寫請求,客戶端直接與其通信
  2. HBaseMaser:負責維護RegionServer;表結構的維護
  3. Zookeeper:維護集群狀態

HBase讀寫操作步驟

  1. 客戶端從zookeeper獲取哪台RegionServer存儲MetaTable(一張特殊表,存儲了所有region信息)。
  2. 客戶端查詢MetaTable所在的RegionServer,獲取哪台RegionServer應負責此次操作的rowKey
  3. 客戶端訪問對應的RegionServer實現數據讀取

RegionServer的組成

  1. WAL:Write Ahead Log,用於存儲寫操作的日誌,用於故障恢復
  2. BlockCache:讀緩存,用於緩存最常訪問數據
  3. MemStore:寫緩存,會定期flush到磁碟
  4. HFile:在HDFS上存儲數據,以有序keyvalue形式存儲

HBase存儲機制

  1. 表是行的集合。
  2. 行是列家族的集合。
  3. 列家族是列的集合。
  4. 列是鍵值對的集合。

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

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.在pom.xml加入SpringSecurity的依賴 <!-- SpringSecurity對Web應用進行許可權管理 --> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-secu ...
  • 使用Metalama為VisualStudio "重構"\ LiveTemplate 菜單中動態添加功能 ...
  • C#自定義配置文件教程,C#App.Config自定義配置文件教程,C#web.Config自定義配置節點 ...
  • 我前面幾篇隨筆介紹了關於幾篇關於SqlSugar的基礎封裝,已經可以直接應用在Winform項目開發上,並且基礎介面也通過了單元測試,同時測試通過了一些Winform功能頁面;本篇隨筆繼續深化應用開發,著手在在.net6框架的Web API上開發應用,也就是基於.net core的Web API應用... ...
  • 本文講講 Ubuntu 18 及以上版本配置 IP 的方法,為什麼它值得一講,因為以 Ubuntu 16 為首的版本的配置方法已經不適用了,如果你還不知道,那本文正好 get 一個新技能。 Ubuntu 18 之後版本配置方法 需要使用 netplan 工具。 對應配置文件: /etc/netpla ...
  • 文件和目錄 1. 文件系統 我們可以把一個磁碟分成一個或多個分區,每個分區包含一個文件系統,這個文件系統由很多柱面組成,而柱面中有一個非常重要的概念叫做 i 節點。 i 節點包含了文件的大部分信息,如文件類型,文件訪問許可權位,文件大小和指向文件數據的指針等,大多數信息都存在st_mode成員中,有兩 ...
  • MySQL學習(第一節自習課) 一. 軟體下載、安裝 下載地址:https://dev.mysql.com/downloads/installer/ 位置:mysql->installer->community1 離線安裝版本,不要選帶web路徑的是離線安裝版本。 安裝省略 進程名稱:mysqld. ...
  • 聲明 個人原創, 轉載需註明來源 https://www.cnblogs.com/milton/p/16216347.html 數據類產品 最近的項目需要接觸大數據處理相關的產品, 涉及了ETL, 數據挖掘和統計, 數據可視化等功能, 因此瞭解了一下這個行業的產品和工具. 最近看的產品主要是 Qua ...
一周排行
    -Advertisement-
    Play Games
  • 1. 說明 /* Performs operations on System.String instances that contain file or directory path information. These operations are performed in a cross-pla ...
  • 視頻地址:【WebApi+Vue3從0到1搭建《許可權管理系統》系列視頻:搭建JWT系統鑒權-嗶哩嗶哩】 https://b23.tv/R6cOcDO qq群:801913255 一、在appsettings.json中設置鑒權屬性 /*jwt鑒權*/ "JwtSetting": { "Issuer" ...
  • 引言 集成測試可在包含應用支持基礎結構(如資料庫、文件系統和網路)的級別上確保應用組件功能正常。 ASP.NET Core 通過將單元測試框架與測試 Web 主機和記憶體中測試伺服器結合使用來支持集成測試。 簡介 集成測試與單元測試相比,能夠在更廣泛的級別上評估應用的組件,確認多個組件一起工作以生成預 ...
  • 在.NET Emit編程中,我們探討了運算操作指令的重要性和應用。這些指令包括各種數學運算、位操作和比較操作,能夠在動態生成的代碼中實現對數據的處理和操作。通過這些指令,開發人員可以靈活地進行算術運算、邏輯運算和比較操作,從而實現各種複雜的演算法和邏輯......本篇之後,將進入第七部分:實戰項目 ...
  • 前言 多表頭表格是一個常見的業務需求,然而WPF中卻沒有預設實現這個功能,得益於WPF強大的控制項模板設計,我們可以通過修改控制項模板的方式自己實現它。 一、需求分析 下圖為一個典型的統計表格,統計1-12月的數據。 此時我們有一個需求,需要將月份按季度劃分,以便能夠直觀地看到季度統計數據,以下為該需求 ...
  • 如何將 ASP.NET Core MVC 項目的視圖分離到另一個項目 在當下這個年代 SPA 已是主流,人們早已忘記了 MVC 以及 Razor 的故事。但是在某些場景下 SSR 還是有意想不到效果。比如某些靜態頁面,比如追求首屏載入速度的時候。最近在項目中回歸傳統效果還是不錯。 有的時候我們希望將 ...
  • System.AggregateException: 發生一個或多個錯誤。 > Microsoft.WebTools.Shared.Exceptions.WebToolsException: 生成失敗。檢查輸出視窗瞭解更多詳細信息。 內部異常堆棧跟蹤的結尾 > (內部異常 #0) Microsoft ...
  • 引言 在上一章節我們實戰了在Asp.Net Core中的項目實戰,這一章節講解一下如何測試Asp.Net Core的中間件。 TestServer 還記得我們在集成測試中提供的TestServer嗎? TestServer 是由 Microsoft.AspNetCore.TestHost 包提供的。 ...
  • 在發現結果為真的WHEN子句時,CASE表達式的真假值判斷會終止,剩餘的WHEN子句會被忽略: CASE WHEN col_1 IN ('a', 'b') THEN '第一' WHEN col_1 IN ('a') THEN '第二' ELSE '其他' END 註意: 統一各分支返回的數據類型. ...
  • 在C#編程世界中,語法的精妙之處往往體現在那些看似微小卻極具影響力的符號與結構之中。其中,“_ =” 這一組合突然出現還真不知道什麼意思。本文將深入剖析“_ =” 的含義、工作原理及其在實際編程中的廣泛應用,揭示其作為C#語法奇兵的重要角色。 一、下劃線 _:神秘的棄元符號 下劃線 _ 在C#中並非 ...