天天看點

Region的拆分與合并

文章目錄

        • 一、拆分與合并的目的
          • 1.拆分
          • 2.合并
        • 二、Region拆分
          • 1.自動拆分
          • 2.手動拆分
            • (1).Linux指令行建立
            • (2).在HBase指令行裡建立
            • (3).指定拆分檔案
            • (4).強制拆分
        • 三、Region合并
          • 1.Minor Compaction
          • 2.Major Compaction
          • 3.三種觸發合并檢查的情況
          • 4.合并操作

一、拆分與合并的目的

1.拆分
  • 當一個Region大到一定程度,或導緻讀取效率太低,是以會進行分裂
  • HBase可以通過Region Split達到負載均衡
  • Region的拆分分為自動拆分與手動拆分
2.合并
  • 當删除了大量的資料後,每一個Region都變小了,這時候再分多個Region就太浪費空間,可以将這些Region合并起來
  • 合并的主要目的不是為了性能考慮,而是出于維護的目的

二、Region拆分

1.自動拆分
  1. 在0.94版本之前,使用的拆分政策是.ConstantSizeRegionSplitPolicy,按照固定大小來拆分Region,即當Region的大小超過預設值(通常預設值是10G),Region就會被HBase拆分成兩個Region,且是平均配置設定。
  2. 0.94版本之後,用到的拆分政策是 IncreasingToUpperBoundRegionSplitPolicy,即這種拆分方法是會随着Region個數變化而變化,比較靈活,具體的計算方法如下:
- tableRegionCounts:表在RegionServer上所有Region的總和
- initalSize:如果沒有重新定義hbase.increasing.policy.initial.size,它的大小就是Memstore的2倍,也就是128*2M
- defaultRegionMaxFileSize:Region的最大大小,預設是10G
           

通過計算可以得出,當Region的個數分别為1,2,3時,檔案大小的上限分别為256M,2G,6912M。當Region個數大于等于4個,檔案大小已經超出10G,是以上限隻能是10G

2.手動拆分

(1).Linux指令行建立

hbase org.apache.hadoop.hbase.util.RegionSplitter my_split_table2 HexStringSplit -c 5 -f mycf
           

org.apache.hadoop.hbase.util.RegionSplitter——調用的一個切分Region類

my_split_table2——表名

HexStringSplit——拆分點算法,這裡采用16進制

-c ——Region的個數

-f ——列族名

執行完成後可以進入HBase中檢視是否建立成功

然後登陸網頁能夠更直覺的看到自己切分的Region:localhost:60010——localhost要用自己的ip位址

Region的拆分與合并

(2).在HBase指令行裡建立

hbase(main):009:0> create 'split2','mycf2',SPLITS=>['aa','bb','cc','dd','ee','ff','zz']
0 row(s) in 2.2930 seconds
=> Hbase::Table - split2
           

同樣也可以登陸網頁檢視切分是否成功。

(3).指定拆分檔案

首先編輯一個拆分檔案student.txt,如下圖,每一行不能有重複

aa
bb
ff
ag
sd
dd
gg
~
           

在HBase指令行開始建立表:

hbase(main):012:0> create 'stu','info',SPLITS_FILE=>'/root/datas/student/student.txt'
0 row(s) in 2.2610 seconds

=> Hbase::Table - stu
hbase(main):013:0>
           

隻需要指定拆分檔案即可。

(4).強制拆分

以上三種拆分方式也叫做Region的預拆分。下面這種屬于對Region的強制拆分。

Region的拆分與合并

上圖是之前做的一個Region通過HBase指令行進行拆分

split2——表名

bb——起始key

1595513677802——終止key

c798b2717d6d7006bd67ad4e6197ed43——終止key的id

現在可以根據這個id在bb和cc之間在強制拆分一個Region

HBase指令行輸入指令:

hbase(main):014:0> split 'c798b2717d6d7006bd67ad4e6197ed43','c'
0 row(s) in 0.0450 seconds
           

就可以發現bb和ccRegion之間又強制被拆分一個Region

PS:因為Region的排序是按照字典順序排序的,是以在強制拆分的時候,要注意Region名的大小

Region的拆分與合并

三、Region合并

1.Minor Compaction
  • 将一部分小檔案合并成更少的大型檔案,通過事件觸發,合并速度較快;合并的時候不會真正的删除,隻是打個标記
  • hbase.hregion.memstore.flush.size 緩存門檻值大小 在hbase-site.xml檔案中可以設定,預設是128M
  • hbase.hstore.compaction.max :每次compact的HFile的最大數目,預設是10
  • hbase.hstore.compaction.kv.max:compact時批量讀取和寫入KeyValue資料的數量,預設是10
2.Major Compaction
  • 将一個HStore中的所有檔案合并成一個檔案,通過時間觸發,合并速度慢,同時還會删除合并之前的小檔案,是以十分消耗性能,一般會将自動合并關掉。
  • hbase.hregion.majorcompaction 時間間隔,預設是7天
3.三種觸發合并檢查的情況
  1. MemStore被刷寫到磁盤
  2. 執行shell指令compact,major_compaction或者調用相應API
  3. HBase背景線程周期性觸發檢查
4.合并操作
#compact一個表的所有regions
compact 't1'
#compact某個空閑的region
compact 'r1'
#compact一個region中的某個列族
compact 'r1', 'c1'
#compact一個表中的某個列族
compact 't1', 'c1'
           

繼續閱讀