1、region 拆分機制
-
region中存儲的是大量的rowkey數據 ,當region中的數據條數過多的時候,直接影響查詢效率.當region過大的時候.hbase會拆分region , 這也是Hbase的一個優點 .
-
HBase的region split策略一共有以下幾種:
-
1、ConstantSizeRegionSplitPolicy
- 0.94版本前默認切分策略
-
當region大小大於某個閾值(hbase.hregion.max.filesize=10G)之後就會觸發切分,一個region等分爲2個region。
- 但是在生產線上這種切分策略卻有相當大的弊端:切分策略對於大表和小表沒有明顯的區分。閾值(hbase.hregion.max.filesize)設置較大對大表比較友好,但是小表就有可能不會觸發分裂,極端情況下可能就1個,這對業務來說並不是什麼好事。如果設置較小則對小表友好,但一個大表就會在整個集羣產生大量的region,這對於集羣的管理、資源使用、failover來說都不是一件好事。
-
2、IncreasingToUpperBoundRegionSplitPolicy
-
0.94版本~2.0版本默認切分策略
-
切分策略稍微有點複雜,總體看和ConstantSizeRegionSplitPolicy思路相同,一個region大小大於設置閾值就會觸發切分。但是這個閾值並不像ConstantSizeRegionSplitPolicy是一個固定的值,而是會在一定條件下不斷調整,調整規則和region所屬表在當前regionserver上的region個數有關係.
- region split的計算公式是:
regioncount^3 128M 2,當region達到該size的時候進行split
例如:
第一次split:1^3 256 = 256MB
第二次split:2^3 256 = 2048MB
第三次split:3^3 256 = 6912MB
第四次split:4^3 256 = 16384MB > 10GB,因此取較小的值10GB
後面每次split的size都是10GB了
-
-
3、SteppingSplitPolicy
-
2.0版本默認切分策略
- 這種切分策略的切分閾值又發生了變化,相比 IncreasingToUpperBoundRegionSplitPolicy 簡單了一些,依然和待分裂region所屬表在當前regionserver上的region個數有關係,如果region個數等於1,
切分閾值爲flush size * 2,否則爲MaxRegionFileSize。這種切分策略對於大集羣中的大表、小表會比 IncreasingToUpperBoundRegionSplitPolicy 更加友好,小表不會再產生大量的小region,而是適可而止。
-
-
4、KeyPrefixRegionSplitPolicy
- 根據rowKey的前綴對數據進行分組,這裏是指定rowKey的前多少位作爲前綴,比如rowKey都是16位的,指定前5位是前綴,那麼前5位相同的rowKey在進行region split的時候會分到相同的region中。
-
5、DelimitedKeyPrefixRegionSplitPolicy
- 保證相同前綴的數據在同一個region中,例如rowKey的格式爲:userid_eventtypeeventid,指定的delimiter爲 ,則split的的時候會確保userid相同的數據在同一個region中。
- 6、DisabledRegionSplitPolicy
- 不啓用自動拆分, 需要指定手動拆分
2、region合併機制
- 不啓用自動拆分, 需要指定手動拆分
1.1 region合併說明
- Region的合並不是爲了性能, 而是出於維護的目的 .
- 比如刪除了大量的數據 ,這個時候每個Region都變得很小 ,存儲多個Region就浪費了 ,這個時候可以把Region合併起來,進而可以減少一些Region服務器節點
1.2 如何進行region合併
1.2.1 通過Merge類冷合併Region
-
執行合併前,==需要先關閉hbase集羣==
- 創建一張hbase表:
create 'test','info1',SPLITS => ['1000','2000','3000']
- 查看錶region
-
需求:
需要把test表中的2個region數據進行合併:
test,,1565940912661.62d28d7d20f18debd2e7dac093bc09d8.
test,1000,1565940912661.5b6f9e8dad3880bcc825826d12e81436. -
這裏通過org.apache.hadoop.hbase.util.Merge類來實現,不需要進入hbase shell,直接執行(==需要先關閉hbase集羣==):
hbase org.apache.hadoop.hbase.util.Merge test test,,1565940912661.62d28d7d20f18debd2e7dac093bc09d8. test,1000,1565940912661.5b6f9e8dad3880bcc825826d12e81436. - 成功後界面觀察
1.2.2 通過online_merge熱合並Region
-
==不需要關閉hbase集羣==,在線進行合併
-
與冷合併不同的是,online_merge的傳參是Region的hash值,而Region的hash值就是Region名稱的最後那段在兩個.之間的字符串部分。
-
需求:需要把test表中的2個region數據進行合併:
test,2000,1565940912661.c2212a3956b814a6f0d57a90983a8515.
test,3000,1565940912661.553dd4db667814cf2f050561167ca030. -
需要進入hbase shell:
merge_region 'c2212a3956b814a6f0d57a90983a8515','553dd4db667814cf2f050561167ca030'
-
成功後觀察界面
merge_region 'c2212a3956b814a6f0d57a90983a8515','553dd4db667814cf2f050561167ca030' - 成功後觀察界面