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)
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 之後得到解決。
相關文章
- HBase-Region太多的問題簡單總結
- http協議/cookie詳解/session詳解HTTP協議CookieSession
- Lombok 註解詳解Lombok
- Java註解詳解Java
- Java 註解詳解Java
- Java註解最全詳解(超級詳細)Java
- HiveQL詳解Hive
- 詳解Inode
- Vuex詳解Vue
- PWA詳解
- 詳解CountDownLatchCountDownLatch
- DiffUtil詳解
- iptables詳解
- TCP詳解TCP
- CDN詳解
- Typescript詳解TypeScript
- Mybatis詳解MyBatis
- Synchronized詳解synchronized
- TLS 詳解TLS
- 詳解bind
- 詳解GOPATHGo
- HTTP 詳解HTTP
- JavaScript this詳解JavaScript
- BT詳解
- nginx 詳解Nginx
- @autowired詳解
- ECharts 詳解Echarts
- DiskBasedCache詳解
- JavaWeb詳解JavaWeb
- IndexedDB詳解Index
- BART詳解
- JDBC詳解JDBC
- Pod詳解
- HugePages詳解
- Service詳解
- Weakmap詳解
- dcokerfile 詳解
- Git詳解Git