HBase 底層原理詳解(深度好文,建議收藏)
阿新 • • 發佈:2021-01-14
## HBase簡介
HBase 是一個分散式的、面向列的開源資料庫。建立在 HDFS 之上。Hbase的名字的來源是 Hadoop database,即 Hadoop 資料庫。HBase 的計算和儲存能力取決於 Hadoop 叢集。
它介於 NoSql 和 RDBMS 之間,僅能通過主鍵(row key)和主鍵的 range 來檢索資料,僅支援單行事務(可通過 Hive 支援來實現多表 join 等複雜操作)。
HBase中表的特點:
1. 大:一個表可以有上十億行,上百萬列
2. 面向列:面向列(族)的儲存和許可權控制,列(族)獨立檢索。
3. 稀疏:**對於為空(null)的列,並不佔用儲存空間,因此,表可以設計的非常稀疏**。
## HBase底層原理
### 系統架構
![HBase系統架構](https://cdn.jsdelivr.net/gh/sunmyuan/cdn/210113_2.png)
根據這幅圖,解釋下HBase中各個元件
#### Client
1. 包含訪問hbase的介面,**Client維護著一些cache來加快對hbase的訪問**,比如regione的位置資訊.
#### Zookeeper
HBase可以使用內建的Zookeeper,也可以使用外接的,在實際生產環境,為了保持統一性,一般使用外接Zookeeper。
Zookeeper在HBase中的作用:
1. 保證任何時候,叢集中只有一個master
2. 存貯所有Region的定址入口
3. 實時監控Region Server的狀態,將Region server的上線和下線資訊實時通知給Master
#### HMaster
1. 為Region server分配region
2. **負責region server的負載均衡**
3. 發現失效的region server並重新分配其上的region
4. HDFS上的垃圾檔案回收
5. 處理schema更新請求
#### HRegion Server
1. HRegion server**維護HMaster分配給它的region**,處理對這些region的IO請求
2. HRegion server負責切分在執行過程中變得過大的region
從圖中可以看到,**Client訪問HBase上資料的過程並不需要HMaster參與**(定址訪問Zookeeper和HRegion server,資料讀寫訪問HRegione server)
**HMaster僅僅維護者table和HRegion的元資料資訊,負載很低。**
### HBase的表資料模型
![HBase的表結構](https://cdn.jsdelivr.net/gh/sunmyuan/cdn/210113_6.png)
#### 行鍵 Row Key
與nosql資料庫一樣,row key是用來檢索記錄的主鍵。訪問hbase table中的行,只有三種方式:
1. 通過單個row key訪問
2. 通過row key的range
3. 全表掃描
Row Key 行鍵可以是任意字串(**最大長度是 64KB**,實際應用中長度一般為 10-100bytes),在hbase內部,row key儲存為位元組陣列。
**Hbase會對錶中的資料按照rowkey排序(字典順序)**
儲存時,資料按照Row key的字典序(byte order)排序儲存。設計key時,要充分排序儲存這個特性,將經常一起讀取的行儲存放到一起。(位置相關性)。
注意:
字典序對int排序的結果是
1,10,100,11,12,13,14,15,16,17,18,19,2,20,21 ... 。**要保持整形的自然序,行鍵必須用0作左填充。**
**行的一次讀寫是原子操作 (不論一次讀寫多少列)**。這個設計決策能夠使使用者很容易的理解程式在對同一個行進行併發更新操作時的行為。
#### 列族 Column Family
**HBase表中的每個列,都歸屬與某個列族**。列族是表的schema的一部分(而列不是),**必須在使用表之前定義**。
列名都以列族作為字首。例如 courses:history , courses:math 都屬於 courses 這個列族。
**訪問控制、磁碟和記憶體的使用統計都是在列族層面進行的。
列族越多,在取一行資料時所要參與IO、搜尋的檔案就越多,所以,如果沒有必要,不要設定太多的列族。**
#### 列 Column
列族下面的具體列,屬於某一個ColumnFamily,類似於在mysql當中建立的具體的列。
#### 時間戳 Timestamp
HBase中通過row和columns確定的為一個存貯單元稱為cell。每個 cell都儲存著同一份資料的多個版本。版本通過時間戳來索引。時間戳的型別是 64位整型。**時間戳可以由hbase(在資料寫入時自動 )賦值**,此時時間戳是精確到毫秒的當前系統時間。時間戳也可以由客戶顯式賦值。如果應用程式要避免資料版本衝突,就必須自己生成具有唯一性的時間戳。**每個 cell中,不同版本的資料按照時間倒序排序**,即最新的資料排在最前面。
為了避免資料存在過多版本造成的的管理 (包括存貯和索引)負擔,hbase提供了兩種資料版本回收方式:
1. 儲存資料的最後n個版本
2. 儲存最近一段時間內的版本(設定資料的生命週期TTL)。
使用者可以針對每個列族進行設定。
#### 單元 Cell
由{row key, co