您好,登錄后才能下訂單哦!
這篇文章給大家介紹HBase1.x中Region的拆分是怎樣的,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
第一部門:Region拆分的實現
client端向hbase寫數據,首先從zookeeper中獲取元數據存儲所在的regionserver,查找對應的region,在region中尋找列族,先向memstore中寫入數據,開始都會先寫入memstore(默認128MB)中(如果開啟了WAL日志,則先寫入WAL日志),隨著數據寫入增加,觸發溢寫操作(flush),溢寫到磁盤文件生成StoreFile。當存儲文件堆積時,RegionServer會將它們壓縮成更少、更大的文件。每次刷新或壓縮完成后,該區域中存儲的數據量將發生變化。RegionServer會根據配置的Region拆分策略,以確定是否提交拆分請求。
拆分策略配置在hbase-site.xml中,HBase的默認拆分策略:IncreasingToUpperBoundRegionSplitPolicy:
<property> <name>hbase.regionserver.region.split.policy</name> <value>org.apache.hadoop.hbase.regionserver.IncreasingToUpperBoundRegionSplitPolicy</value></property>
拆分Region是由Regionserver本地決定,但是會有很多參與者協調,Regionserver再進行拆分前后都會通知HMaster,更新.mea元數據表信息,并重排HDFS目錄結構和數據文件;Regionserver會保留執行狀態的日志,以便發生錯誤時進行任務回滾,下面是HBase官網Region拆分實現流程圖,來自RegionServers或Master的操作顯示為紅色,而來自客戶端的操作顯示為綠色,如圖所示:
RegionServer拆分第一步,RegionServer獲取表上的共享讀鎖定,以防止在拆分過程中修改架構。然后它在zookeeper下的/hbase/region-in-transition/region-name創建一個znode,并將znode的狀態設置為SPLITTING。
Master開始了解znode,因為它有一個 region-in-transition的觀察器。
RegionServer在HDFS中的parent region目錄下創建一個子目錄.splits。
RegionServer關閉parent region并在其本地數據結構中將region標記為離線。拆分region現在處于離線狀態。這時來自parent region的客戶端請求將拋出NotServingRegionException。客戶端將重試一些備份。關閉Region被刷新。
RegionServer在.splits目錄下為child regionA和B創建region目錄,并創建必要的數據結構。然后,它會拆分存儲文件,因為它會在parent region中為每個存儲文件創建兩個引用文件。這些引用文件將指向parent region的文件。
RegionServer在HDFS中創建實際的region目錄,并為每個child region移動引用文件。
RegionServer向.META.表發送一個Put請求,并將.META.表中的parent region設置為離線,添加有關子child region的信息。這里,.META.中的子region將不會有單獨的條目。客戶端將看到parent region在掃描.META.時被拆分。但直到他們出現在.META.其中才會知道這些child region。此外,如果Put到.META.成功后,parent region將會有效地拆分。如果RegionServer在此RPC成功之前失敗,則Master和下一個Region Server打開該區域將清除有關region拆分的不干凈狀態。更新.META.之后,region分割將由Master進行前滾。
RegionServer并行打開child reigon A和B.
RegionServer將child reigon A和B添加到.META.,連同它承載區域的信息。拆分reigon 現在處于在線狀態。在此之后,客戶端可以發現新的reigon 并向他們發出請求。客戶端在本地緩存.META.條目,但是當他們向RegionServer或者.META.發出請求時,他們的緩存將失效,他們將從.META.中了解新的reigon 。
RegionServer更新ZooKeeper中的znode /hbase/region-in-transition/region-name以表示狀態SPLIT,以便主服務器可以了解它。必要時,平衡器可以自由地將子reigon 重新分配給其他RegionServer。拆分事務現在已完成。
拆分之后,.META.和HDFS仍將包含對parent region的引用。在child region中進行壓縮重寫數據文件時,這些引用將被刪除。主服務器中的垃圾收集任務會定期檢查child region是否仍然引用parent region的文件。否則,parent region將被刪除。
第二部分:Region拆分方式
主要有三種拆分方式:預拆分、自動拆分、手動強制拆分;
1.預拆分,
就是在新建表時進行region拆分,根據數據分布特點,提前預分區可減少rowkey熱點問題,另一方面減少region分裂導致短時不可用。
兩種方法預分區:
方法一:
hbase org.apache.hadoop.hbase.util.RegionSplitter table_spilt_test1 HexStringSplit -c 10 -f info1:info2:info3
表名:table_spilt_test1
拆分的region的數量:10
列族:info1,info2,info3
方法二:
指定每個預拆分的region的rowkey的開始值
create 'test_table', 'table_spilt_test1 ', SPLITS=> ['1001', '2001', '3001']
2.自動拆分:
Region默認大小為10G,超過10G就自動進行拆分,Region大小通過下面面這個參數控制,生產環境如果預分區后,每個Region數據都比較大可改成20G 30G:
<property> <name>hbase.hregion.max.filesize</name> <value>10737418240</value> </property>
3.手動強制拆分:
可在hbase shell根據提示,對某個region進行強制拆分
Examples: split 'tableName' split 'namespace:tableName' split 'regionName' # format: 'tableName,startKey,id' split 'tableName', 'splitKey' split 'regionName', 'splitKey
第三部分:Region拆分觸發條件
HBase表的拆分由以下公式決定:
Min (X^2 * "hbase.hregion.memstore.flush.size", "hbase.hregion.max.filesize")
說明:
1).X是該region中所包含的該表的region的數量;
2).hbase.hregion.memstore.flush.size默認值是128M;
3).hbase.hregion.max.filesize 默認值是10GB
新建一張表并開始寫入數據時,當達到128M開始第一次拆分,之后依次是512MB, 1152MB, 2GB, 3.2GB, 4.6GB, 6.2GB時候開始進行拆分,當達到hbase.hregion.max.filesize的設定值時便會永遠在storefile 達到hbase.hregion.max.filesize進行拆分。
需要特別注意的是filessize指的是store下的storefile的大小并不是整個region的大小,一個region可能包含很多個store,確切的說是該表有多少個family就有多少個store,當某個family下的storefile達到以上標準是就會拆分整個region而不管改region下的其他的store下的storefile是否已經達到觸發條件。
關于HBase1.x中Region的拆分是怎樣的就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。