天天看點

轉 Hbase split的三種方式

在hbase中split是一個很重要的功能,hbase是通過把資料配置設定到一定數量的region來達到負載均衡的。一個table會被配置設定到一個或多個region中,這些region會被配置設定到一個或者多個regionserver中。在自動split政策中,當一個region達到一定的大小就會自動split成兩個region。table在region中是按照row key來排序的,并且一個row key所對應的行隻會存儲在一個region中,這一點保證了hbase的強一緻性 。

在一個region中有一個或多個stroe,每個stroe對應一個column families(列族)。一個store中包含一個memstore 和 0 或 多個store files。每個column family 是分開存放和分開通路的。

pre-splitting

當一個table剛被建立的時候,hbase預設的配置設定一個region給table。也就是說這個時候,所有的讀寫請求都會通路到同一個regionserver的同一個region中,這個時候就達不到負載均衡的效果了,叢集中的其他regionserver就可能會處于比較空閑的狀态。解決這個問題可以用pre-splitting,在建立table的時候就配置好,生成多個region。

在table初始化的時候如果不配置的話,hbase是不知道如何去split region的,因為hbase不知道應該那個row key可以作為split的開始點。如果我們可以大概預測到row key的分布,我們可以使用pre-spliting來幫助我們提前split region。不過如果我們預測得不準确的話,還是可能導緻某個region過熱,被集中通路,不過還好我們還有auto-split。最好的辦法就是首先預測split的切分點,做pre-splitting,然後後面讓auto-split來處理後面的負載均衡。

在hbase shell 下:

-c 10 的意思為,最終的region數目為10個;-f  f1為建立一個那麼為f1的 column family.

執行scan 'hbase:meta' 可以看到meta表中的,

轉 Hbase split的三種方式

隻截取了meta表中的2個region的記錄(一共10個region),分别是rowkey範圍是 '' ''~19999999 和19999999~33333332的region。

我們也可以自定義切分點,例如在hbase shell下使用如下指令:

自動splitting

而0.94版本中,increasingtoupperboundregionsplitpolicy 是預設的split政策。

這個政策中,最小的分裂大小和table的某個region server的region 個數有關,當store file的大小大于如下公式得出的值的時候就會split,公式如下

例如:

hbase.hregion.memstore.flush.size 預設值 128mb。

hbase.hregion.max.filesize預設值為10gb 。

如果初始時r=1,那麼min(1*1*1*2*128mb,10gb)=128mb,也就是說在第一個flush的時候就會觸發分裂操作。

當r=2的時候min(2*2*2*2*128mb,10gb)=2048mb ,當某個store file大小達到2048mb的時候,就會觸發分裂。

 如此類推,當r=4的時候,store file 達到10gb的時候就會分裂,也就是說當r>=4的時候,store file 達到10gb的時候就會分裂。

split 點都位于region中row key的中間點。

keyprefixregionsplitpolicy可以保證相同的字首的row儲存在同一個region中。

指定rowkey字首位數劃分region,通過讀取 keyprefixregionsplitpolicy.prefix_length  屬性,該屬性為數字類型,表示字首長度,在進行split時,按此長度對splitpoint進行截取。此種政策比較适合固定字首的rowkey。當table中沒有設定該屬性,指定此政策效果等同與使用increasingtoupperboundregionsplitpolicy。

我們可以通過配置 hbase.regionserver.region.split.policy 來指定split政策,我們也可以寫我們自己的split政策。

強制split

hbase 允許用戶端強制執行split,在hbase shell中執行以下指令:

繼續閱讀