HBase-Region詳解

一塵在心發表於2018-08-24

HBase-Region詳解

Region的概念

Region是HBase資料管理的基本單位。資料的move,資料的balance,資料的split,都是按照region來進行操作的。

region中儲存這使用者的真實資料,而為了管理這些資料,HBase使用了RegionSever來管理region。

一個表中可以包含一個或多個Region。
每個Region只能被一個RS(RegionServer)提供服務,RS可以同時服務多個Region,來自不同RS上的Region組合成表格的整體邏輯檢視。

regionServer  其實是hbase的服務,部署在一臺物理伺服器上,region有一點像

關係型資料的分割槽,資料存放在region中,當然region下面還有很多結構,確切來

說資料存放在memstore和hfile中。我們訪問hbase的時候,先去hbase 系統表查詢

定位這條記錄屬於哪個region,然後定位到這個region屬於哪個伺服器,然後就到

哪個伺服器裡面查詢對應region中的資料

 每個region 有三個主要要素:

它所屬於哪張表

它所包含的的第一行(第一個region 沒有首行)

它所包含的最後一行(末一個region 沒有末行)

          當表初寫資料時,此時表只有一個region ,當隨著資料的增多,region 開始變大,等到它達到限定的閥值大小時,變化把region 分裂為兩個大小基本相同的region,

    而這個閥值就是storefile 的設定大小(引數:hbase.hregion.max.filesize 新版本預設10G) ,在第一次分裂region之前,所有載入的資料都放在原始區域的那臺伺服器上,隨著表的變大

    region 的個數也會相應的增加,而region 是Hbase叢集分佈資料的最小單位。

          (但region 也是由block組成,具體這個block和hdfs block什麼樣的關係後面再說,region是屬於單一的regionserver,除非這個regionserver 當機,或者其它方式掛掉,再或者執行balance時,才可能會將這部分region的資訊轉移到其它機器上。)

          * 這也就是 為什麼region比較少的時候,導致region分配不均,總是分派到少數的節點上,讀寫併發效果不顯著,這就是hbase 讀寫效率比較低的原因。

Region的結構

 

1 層級結構

 

· Table (HBase 表)

· Region(表的Regions)

    o Store(Region中以列族為單位的單元)

           § MemStore (用於寫快取)

                § StoreFile (StoreFiles for each Store for each Region for the table)

                      § Block (讀寫的最小單元)

2 重要成員

2.1 Region

Region是HBase資料儲存和管理的基本單位

2.1.1 Region的數量設計

設計的本意是每個Server執行小數量(2-200)個大容量(5-20Gb)的Region,理由如下:

· 每個MemStore需要2MB的堆記憶體,2MB是配置的,假如有1000擁有兩個列族的Region,那麼就需要3.9GB的堆記憶體,還是沒有儲存任何資料的情況下

· HMaster要花大量的時間來分配和移動Region

· 過多Region會增加ZooKeeper的負擔

· 每個Region會對應一個MapReduce任務,過多Region會產生太多工

2.1.2 Region的分配

2.1.2.1 啟動時的分配步驟

 Master啟動時呼叫 AssignmentManager。

 AssignmentManager 檢視hbase:meta中已經分配好的Region

 如果Regiond的分配依然有效的話 (如果RegionServer 仍然線上的話) 維持當前分配

如果分配失效,LoadBalancerFactory 會被呼叫來分配region. 負載均衡器(HBase 1.0預設使用StochasticLoadBalancer ) 分配任務到Region Server中

 如果需要的話,Region Server分配資訊會更新到hbase:meta中。RegionServer啟動時呼叫啟動程式碼來啟動region。

2.1.2.2 RegionServer失效時的分配步驟

1. Region Server掛掉後它上面的regions變得不可用。

2. Master檢測到Region Server掛掉了。

3. 失效Region Server上的region分配會被認為無效並採用跟啟動時同樣順序的步驟分配region

4. 正在進行的查詢操作會重新執行,不會丟失

5. 切換動作要在以下時間內完成:
ZooKeeper session timeout + split time + assignment/replay time

2.1.3 Region的位置選擇

Region的位置選擇通過HDFS的複製機制完成

1)步驟:

1. 第一個副本寫在本地節點

2. 第二副本寫到另一個機上任意節點

3. 第三個副本寫到跟第二副本相同機架不同節點的其他節點

4. 後面的副本將寫到叢集中的任意節點中。

 

2)要點:

· 選址是在flush或者compaction之後執行的

· 當RegionServer失效後,其上的Region被轉移到其他的RegionServer,那麼此時被轉移的Region不具備資料本地性,直到下一次compaction執行之後才重新具備資料本地性

2.1.4 Region的切分

· 當Region的大小達到指定的閥值時,RegionServer會執行Region的切分

· 該操作有RegionServer單獨執行,Master不參與

· 分裂執行完畢後,會將子Region新增到hbase:meta並且彙報給Master

· 可以自定義切分策略,可以在hbase-site.xml設定

<property>

  <name>hbase.regionserver.region.split.policy</name>

  <value>org.apache.hadoop.hbase.regionserver.IncreasingToUpperBoundRegionSplitPolicy</value></property>

· 支援手動執行切分

· 可以指定切分點

 

2.1.5 Region的合併

2.1.5.1 意義

· 當存在大量沒有資料的region時,執行region的合併來避免region過多

· 之所以會存在大量沒有資料的region是因為為了避免region到達閥值引起分裂的開銷,建立表格時先進行預分割槽。

2.1.5.2 步驟

1. 客戶端傳送指令給Master

2. Master收到指令後將要合併的region移動到指定的RegionServer

3. Master傳送Merge請求給指定的RegionServer執行合併操作

4. 最後將被合併的regions從hbase:meta中刪除並新增合併後的region

2.2 Store

· 以列族為單元,即對應表中每個region中一個列族

· 包含一個MemStore和0到多個StoreFile(HFile)

2.2.1 MemStore

· 將修改資訊快取在記憶體當中

· 資訊格式為Cell/KeyValue

· 當flush觸發時,MemStore會生成快照儲存起來,新的MemStore會繼續接收修改資訊,指導flush完成之後快照會被刪除

· 當一個MemStore flush發生時,屬於同一個region的memStore會一起flush

2.2.2.1 MemStore Flush的觸發情況

· MemStore的大小達到單個MemStore閥值

· RegionServer中所有MemStore的使用率超過RS中MemStore上限值,該Server上所有MemStore會執行flush直到完成或者小於RS中MemStore安全值

· RegionServer中WAL超過WAL閥值

單個MemStore閥值:hbase.hregion.memstore.flush.size
RS中MemStore上限值:hbase.regionserver.global.memstore.upperLimit

RS中MemStore安全值:hbase.regionserver.global.memstore.lowerLimit
WAL閥值:hbase.regionserver.max.logs

2.3 StoreFile/HFile

2.3.1 格式

2.3.1.1 概念:

· Data Block Size:資料塊大小。預設為64KB。因為查詢key是按照順序查詢的,所以需要選擇合適的Size來避免一個Block包含過多Key/Value對。

· Maximum Key Length:最大key長度。10-100位元組是比較合適的大小,key的形式:rowkey+column family:qualifier+timestamp

· Maximum File Size:最大File大小。Trailer、File-Info和Data-Index都會在讀取和寫入時存到記憶體中,所以最好保證File的大小在合理的範圍,避免佔用過多記憶體。

· Compression Algorithm:壓縮演算法。

· 好處:

o 減少磁碟I/O

o 提高傳輸效率和減少磁碟空間

o 減少讀取請求的返回量

· 支援的壓縮庫

o GZ

o LZO

2.3.1.2 HFile 結構

結構圖如下:

 

 

HFile結構圖

 

Trailer結構

· Data Block:儲存鍵值對的長度和值

· Meta Block:使用者定義後設資料

· File Info:關於HFile的後設資料

· Data Index:Data Block的索引,也就是每個Block的第一個Key的偏移量

· Trailer:固定的源資料,用於儲存以上每個部分的偏移量,讀取HFile時首先要讀取Trailer。

2.3.2 KeyValue

 

KeyValue以位元組陣列的形式儲存,包含以下部分:

· keylength

· valuelength

· key

· value

Key的格式如下:

· rowlength

· row (也就是the rowkey)

· columnfamilylength

· columnfamily

· columnqualifier

· timestamp

· keytype (例如 Put, Delete, DeleteColumn, DeleteFamily)

2.4 Scan 步驟

1. 當客戶端提交scan請求時,HBase會建立為每個Region建立RegionScanner 例項來處理scan請求

· RegionScanner 包含一組StoreScanner例項,每個列族對應一個StoreScanner例項

· 每個StoreScanner例項包含一組StoreFileScanner例項, 每個toreFileScanner例項對應每個列族的HFile, 同時包含一組對應MemStore的KeyValueScanner。

· The two lists are merged into one, which is sorted in ascending order with the scan object for the MemStore at the end of the list.

· 當StoreFileScanner例項被構造, 會生成MultiVersionConcurrencyControl 讀取點, 就是當前的memstoreTS, 用來過濾掉

2.5 Compaction

2.5.1 Minor Compaction(次壓縮)

HBase會自動挑選小的臨近的HFiles將它們重新寫到一些大的HFiles中。這個過程稱為次壓縮。次壓縮通過將更小的files寫到一些大的flies進行合併操作來實現減少file的數量。

 

 

 

2.5.2 Major Compaction(主壓縮)

· 合併一個Region中每一個列族的所有HFile寫到一個HFile中

· 會刪除掉那些標記刪除和過期的cells。提高了讀取效能

· 將所有資料進行了重寫,產生大量的I/O開銷或者網路開銷,稱為寫放大

· 自動執行,通常安排在週末或者晚上

 

2.6 Region 負載均衡

當region分裂之後,RS之間的region數量差距變大時,HMaster便會執行負載均衡來調整部分region的位置,使得每個RS的region數量保持在合理範圍之內,負載均衡會引起region的重新定位,使得涉及的region不具備資料本地性,即HFile和region不在同一個DataNode。這種情況會在major compaction 之後得到解決。