當前位置:
首頁 > 最新 > HBase Region重點剖析

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)

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

§MemStore (用於寫緩存)

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

§Block (讀寫的最小單元)


2 重要成員

Region是HBase數據存儲和管理的基本單位


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

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

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

·過多Region會增加ZooKeeper的負擔

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


2.1.2.1 啟動時的分配步驟

Master啟動時調用 AssignmentManager。

AssignmentManager查看hbase:meta中已經分配好的Region

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

如果分配失效,LoadBalancerFactory會被調用來分配region. 負載均衡器(HBase1.0默認使用StochasticLoadBalancer) 分配任務到RegionServer中

如果需要的話,RegionServer分配信息會更新到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

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

1)步驟:

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

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

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

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

2)要點:

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

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

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

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

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

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

org.apache.hadoop.hbase.regionserver.IncreasingToUpperBoundRegionSplitPolicy

·支持手動執行切分

·可以指定切分點


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


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

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


·將修改信息緩存在內存當中

·信息格式為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.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減少讀取請求的返回量

·支持的壓縮庫

oGZ

oLZO

2.3.1.2 HFile 結構

結構圖如下:

HFile結構圖

Trailer結構

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

·Meta Block:用戶定義元數據

·File Info:關於HFile的元數據

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

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


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

·keylength

·valuelength

·key

·value

Key的格式如下:

·rowlength

·row (也就是the rowkey)

·columnfamilylength

·columnfamily

·columnqualifier

·timestamp

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


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, 用來過濾掉


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


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

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

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

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


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


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 IT巔峰技術 的精彩文章:

TAG:IT巔峰技術 |