Hadoop大資料實戰系列文章之HBase

testingbang發表於2020-11-11

HBase – Hadoop Database,是一個高可靠性、高效能、面向列、可伸縮的分散式儲存系統,利用 HBase 技術可在廉價 PC Server 上搭建起大規模結構化儲存叢集。

本章內容:

1) Hbase 簡介

2) Hbase 資料模型

3) Hbase 基礎原理

4) Hbase 系統架構

5) Hbase 基礎操作

1. Hbase 簡介

HBase 是 Apache Hadoop 中的一個子專案,Hbase 依託於 Hadoop 的 HDFS 作為最基本儲存基礎單元,透過使用hadoop的DFS工具就可以看到這些這些資料儲存資料夾的結構,還可以透過 Map/Reduce 的框架(演算法)對 HBase 進行操作。

Hadoop大資料實戰系列文章之HBase

上圖描述了 Hadoop EcoSystem 中的各層系統,其中 HBase 位於結構化儲存層,Hadoop HDFS 為 HBase 提供了高可靠性的底層儲存支援,Hadoop MapReduce 為HBase提供了高效能的計算能力,Zookeeper為HBase提供了穩定服務和failover機制。

Hbase 適用場景:

1) 大資料量儲存,大資料量高併發操作

2) 需要對資料隨機讀寫操作

3) 讀寫訪問均是非常簡單的操作

Hbase 與 HDFS 對比:

Hadoop大資料實戰系列文章之HBase

 兩者都具有良好的容錯性和擴充套件性,都可以擴充套件到成百上千個節點;

 HDFS 適合批處理場景,但不支援資料隨機查詢,不適合增量資料處理,不支援數

據更新

2. Hbase 資料 模型

HBase 以表的形式儲存資料。表由行和列族組成。列劃分為若干個列族(row family),其邏輯檢視如下:

Hadoop大資料實戰系列文章之HBase

幾個關鍵概念:

1) 行鍵(RowKey)

 行鍵是位元組陣列, 任何字串都可以作為行鍵;

 表中的行根據行鍵進行排序,資料按照 Row key 的位元組序(byte order)排序儲存;

 所有對錶的訪問都要透過行鍵 (單個RowKey訪問,或RowKey範圍訪問,或全表掃描)

2) 列族(ColumnFamily)

 CF 必須在表定義時給出

 每個 CF可以有一個或多個列成員(ColumnQualifier),列成員不需要在表定義時給出,新的列族成員可以隨後按需、動態加入

 資料按CF分開儲存,HBase所謂的列式儲存就是根據CF分開儲存(每個CF對應一個 Store),這種設計非常適合於資料分析的情形

3) 時間戳(TimeStamp)

 每個 Cell 可能又多個版本,它們之間用時間戳區分

4) 單元格(Cell)

 Cell 由行鍵,列族:限定符,時間戳唯一決定

 Cell 中的資料是沒有型別的,全部以位元組碼形式儲存

5) 區域(Region)

 HBase 自動把表水平(按 Row)劃分成多個區域(region),每個 region 會儲存一個表裡面某段連續的資料;

 每個表一開始只有一個 region,隨著資料不斷插入表,region 不斷增大,當增大到一個閥值的時候,region 就會等分會兩個新的 region;

 當 table 中的行不斷增多,就會有越來越多的 region。這樣一張完整的表被儲存在多個 Region 上。

Hadoop大資料實戰系列文章之HBase

 Region雖然是分散式儲存的最小單元,但並不是儲存的最小單元。Region由一個或者多個Store組成,每個store儲存一個columns family;每個Strore又由一個 memStore 和 0 至多個 StoreFile 組成,StoreFile 包含 HFile;memStore 儲存在記憶體中,StoreFile 儲存在 HDFS 上。

3. Hbase 架構 及 基本元件

Hadoop大資料實戰系列文章之HBase

從上圖看到 HBase 的基本元件:

1) Client:

 包含訪問HBase的介面,並維護cache來加快對HBase的訪問,比如region的位置資訊。

2) Master

 為 Region server 分配 region

 負責 Region server 的負載均衡

 發現失效的 Region server 並重新分配其上的region

 管理使用者對 table 的增刪改查操作

3) Region Server

 Regionserver 維護 region,處理對這些 region 的 IO 請求

 Regionserver 負責切分在執行過程中變得過大的 region

4) Zookeeper 作用

Hadoop大資料實戰系列文章之HBase

 透過選舉,保證任何時候,叢集中只有一個Master,Master與RegionServers啟動時會向 ZooKeeper 註冊

 儲存所有 Region 的定址入口

 實時監控 Region server 的上線和下線資訊,並實時通知給 Master

 儲存 HBase 的 schema 和 table 後設資料

 預設情況下,HBase 管理 ZooKeeper 例項,比如, 啟動或者停止ZooKeeper

 Zookeeper 的引入使得 Master 不再是單點故障

4. Hbase 容錯 與 恢復

Hadoop大資料實戰系列文章之HBase

每個HRegionServer中都有一個HLog物件,HLog是一個實現Write Ahead Log的類,在每次使用者操作寫入 MemStore 的同時,也會寫一份資料到 HLog 檔案中(HLog 檔案格式見後續),HLog 檔案定期會滾動出新的,並刪除舊的檔案(已持久化到 StoreFile 中的資料)。當 HRegionServer 意外終止後,HMaster會透過 Zookeeper感知到,HMaster首先會處理遺留的 HLog 檔案,將其中不同 Region 的 Log 資料進行拆分,分別放到相應region的目錄下,然後再將失效的region重新分配,領取到這些region的HRegionServer在 Load Region 的過程中,會發現有歷史 HLog 需要處理,因此會 Replay HLog 中的資料到 MemStore 中,然後 flush 到 StoreFiles,完成資料恢復

Hbase 容錯性:

1) Master 容錯:Zookeeper 重新選擇一個新的 Master

 無 Master 過程中,資料讀取仍照常進行;

 無 master 過程中,region 切分、負載均衡等無法進行;

2) RegionServer 容錯:定時向 Zookeeper彙報心跳,如果一旦時間內未出現心跳,Master 將該 RegionServer 上的 Region 重新分配到其他 RegionServer 上,失效伺服器上“預寫”日誌由主伺服器進行分割並派送給新的 RegionServer

3) Zookeeper容錯:Zookeeper是一個可靠地服務,一般配置3或5個Zookeeper例項

Region 定位流程:

Hadoop大資料實戰系列文章之HBase

尋找 RegionServer 過程:ZooKeeper--> -ROOT-(單 Region)--> .META.--> 使用者表

1) -ROOT-

 表包含.META.表所在的 region 列表,該表只會有一個 Region;

 Zookeeper 中記錄了-ROOT-表的 location。

2) .META.

 表包含所有的使用者空間 region 列表,以及 RegionServer 的伺服器地址。

5. Hbase 基礎操作

1) 進入 hbase shell console

$HBASE_HOME/bin/hbase shell

表的管理:

2) 檢視有哪些表

list

3) 建立表

# 語法:create <table>, {NAME => <family>, VERSIONS => <VERSIONS>}

# 例如:建立表 t1,有兩個 family name:f1,f2,且版本數均為 2

> create 't1',{NAME => 'f1', VERSIONS => 2},{NAME => 'f2', VERSIONS => 2}

4) 刪除表

# 分兩步:首先 disable,然後 drop

# 例如:刪除表 t1

> disable 't1'

> drop 't1'

5) 檢視錶的結構

# 語法:describe <table>

# 例如:檢視錶 t1 的結構

> describe 't1'

6) 修改表結構

# 修改表結構必須先 disable

# 語法:alter 't1', {NAME => 'f1'}, {NAME => 'f2', METHOD => 'delete'}

# 例如:修改表 test1 的 cf 的 TTL 為 180 天

> disable 'test1'

> alter 'test1',{NAME=>'body',TTL=>'15552000'},{NAME=>'meta', TTL=>'15552000'}

> enable 'test1'

許可權管理:

1) 分配許可權

# 語法 : grant <user> <permissions> <table> <column family> <column qualifier> 引數

後面用逗號分隔

# 許可權用五個字母表示: "RWXCA".

# READ('R'), WRITE('W'), EXEC('X'), CREATE('C'), ADMIN('A')

# 例如,給使用者‘test'分配對錶 t1 有讀寫的許可權,

> grant 'test','RW','t1'

2) 檢視許可權

# 語法:user_permission <table>

# 例如,檢視錶 t1 的許可權列表

> user_permission 't1'

3) 收回許可權

# 與分配許可權類似,語法:revoke <user> <table> <column family> <column qualifier>

# 例如,收回 test 使用者在表 t1 上的許可權

> revoke 'test','t1'

表資料的增刪改查:

1) 新增資料

# 語法:put <table>,<rowkey>,<family:column>,<value>,<timestamp>

# 例如:給表 t1 的新增一行記錄:rowkey 是 rowkey001,family name:f1,column name:

col1,value:value01,timestamp:系統預設

> put 't1','rowkey001','f1:col1','value01'

2) 查詢資料——查詢某行記錄

# 語法:get <table>,<rowkey>,[<family:column>,....]

# 例如:查詢表 t1,rowkey001 中的 f1 下的 col1 的值

> get 't1','rowkey001', 'f1:col1'

# 或者:

> get 't1','rowkey001', {COLUMN=>'f1:col1'}

# 查詢表 t1,rowke002 中的 f1 下的所有列值

hbase(main)> get 't1','rowkey001'

3) 查詢資料——掃描表

# 語法:scan <table>, {COLUMNS => [ <family:column>,.... ], LIMIT => num}

# 另外,還可以新增 STARTROW、TIMERANGE 和 FITLER 等高階功能

# 例如:掃描表 t1 的前 5 條資料

> scan 't1',{LIMIT=>5}

4) 查詢表中的資料行數

# 語法:count <table>, {INTERVAL => intervalNum, CACHE => cacheNum}

# INTERVAL 設定多少行顯示一次及對應的 rowkey,預設 1000;CACHE 每次去取的快取區大

小,預設是 10,調整該引數可提高查詢速度

# 例如,查詢表 t1 中的行數,每 100 條顯示一次,快取區為 500

> count 't1', {INTERVAL => 100, CACHE => 500}

5) 刪除資料——刪除行中的某個列值

# 語法:delete <table>, <rowkey>, <family:column> , <timestamp>,必須指定列名

# 例如:刪除表 t1,rowkey001 中的 f1:col1 的資料

> delete 't1','rowkey001','f1:col1'

6) 刪除資料——刪除行

# 語法:deleteall <table>, <rowkey>, <family:column> , <timestamp>,可以不指定列名,

刪除整行資料

# 例如:刪除表 t1,rowk001 的資料

> deleteall 't1','rowkey001'

7) 刪除資料——刪除表中的所有資料

# 語法: truncate <table>

# 其具體過程是:disable table -> drop table -> create table

# 例如:刪除表 t1 的所有資料

> truncate 't1'

Region 管理:

1) 移動 Region

# 語法:move 'encodeRegionName', 'ServerName'

# encodeRegionName 指的 regioName 後面的編碼,ServerName 指的是 master-status 的

Region Servers 列表

# 示例

>move '4343995a58be8e5bbc739', 'db-41.xxx.xxx.org,60020,139'

2) 開啟/關閉 region

# 語法:balance_switch true|false

hbase(main)> balance_switch

3) 手動 split

# 語法:split 'regionName', 'splitKey'

4) 手動觸發 major compaction

#語法:

#Compact all regions in a table:

> major_compact 't1'

#Compact an entire region:

> major_compact 'r1'

#Compact a single column family within a region:

> major_compact 'r1', 'c1'

#Compact a single column family within a table:

> major_compact 't1', 'c1'


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69942496/viewspace-2733416/,如需轉載,請註明出處,否則將追究法律責任。

相關文章