本文系轉載,若有侵權,請聯繫我:likui0913@gmail.comhtml
Region 是表格可用性和分佈的基本元素,由列族(Column Family)構成的 Store 組成。對象的層次結構以下:shell
- Table
- Region
- Store (由每一個 Region 中的列族組成的存儲塊)
- MemStore (每一個 Region 中存儲在內存中的 Store)
- StoreFile (每一個 Region 中被持久化後的 Store)
- Block (StoreFile 內被分塊存儲後的塊)
其中 StoreFile 在 HDFS 中的存儲路徑爲:apache
/hbase
/data
/<Namespace> (Namespaces in the cluster)
/<Table> (Tables in the cluster)
/<Region> (Regions for the table)
/<ColumnFamily> (ColumnFamilies for the Region for the table)
/<StoreFile> (StoreFiles for the ColumnFamily for the Regions for the table)
一般而言,HBase 被設計成每臺服務器運行一個數量較小的(20 - 200)但大小相對較大(5 - 20 GB)的 Region。那麼爲何應該保持 Region 數量較低?服務器
如下是保持較低 Region 數量的一些緣由:session
每一個 MemStore 須要 2MB 的 MSLAB(MemStore-local 分配的 buffer)- 至關於每一個 Region 的每一個列族(ClounmFamily)須要 2MB 的 MSLAB。那麼 1000 個有 2 個列族的 Region 將使用 2MB * 1000 * 2 = 4000MB ~= 3.9GB 的堆內存,甚至都尚未開始存儲數據。注:MSLAB 的大小是可配置的,默認爲 2MB.負載均衡
舉個實例來講:目前的一個集羣單臺 RegionServer 分配的內存大小爲 32GB,其中全部的 MemStore 的最大大小比例設置爲 0.4,即最大大小爲 32GB * 0.4 = 12.8GBide
Master 很討厭太多的 Region,由於這可能須要大量的時間分配並批量移動。ui
在比較舊版本的 HBase(HFile v2, 0.90 以前的版本)中,幾個 RegionServer 上的大量的 Region 會致使存儲文件索引上升,增長堆使用量,並可能在 RS 致使內存壓力或 OOME。spa
請參考Determining region count and size配置 Region 數量。.net
當 HBase 啓動 RegionServer 分配時,簡要過程以下:
當 RegionServer 失敗時:
ZooKeeper session timeout + split time + assignment/replay time
Region 能夠被負載平衡器(LoadBalancer)按期的移動。
HBase 維持每一個 Region 的狀態,並將它們的狀態保存在 hbase:meat 表中,hbase:meta 的 Region 狀態則保存在 Zookeeper 中。在 Master Web UI 中能夠查看轉換中的 Region 狀態。如下是可能的 Region 狀態列表:
狀態轉換圖以下:
圖示說明:
Master將Region從OFFLINE
轉換成OPENING
狀態,並嘗試將該區域分配給RegionServer。RegionServer可能收到也可能未收到開放Region的請求。Master會重試將打開Region請求發送RegionServer,直到RPC經過或Master用完重試。在RegionServer收到打開Region請求後,RegionServer開始打開Region;
若是Master重試超時,則即便RegionServer正在打開Region,Master也會經過將Region轉換爲CLOSING
狀態並嘗試關閉它來阻止RegionServer繼續打開該Region;
RegionServer打開該Region後,它將繼續嘗試通知Master,直到Master將該Region轉換爲OPEN
狀態並通知RegionServer,該Region纔算打開;
若是RegionServer沒法打開Region,它會通知Master。而後Master將該Region轉換爲CLOSED
狀態,並嘗試在其它的RegionServer上打開該Region;
若是Master沒法打開某個Region,則會將Region轉換爲FAILED_OPEN
狀態,而且在管理員使用HBase shell操做以前或服務器死亡以前不會採起進一步的操做;
Master將Region從OPEN
轉換爲CLOSING
狀態。持有Region的RegionServer可能已經或可能未收到關閉Region請求。Maater將重試向服務器發送關閉請求,直到RPC經過或Master用盡重試;
若是RegionServer不在線或引起NotServingRegionException,則Master將該Region轉換爲OFFLINE
狀態,並將其從新分配給其它的RegionServer;
若是RegionServer處於聯機狀態,但在Master用完重試以後沒法訪問,則Master會將該Region移至FAILED_CLOSE
狀態,而且不會採起進一步的操做,直到操做員從HBase shell進行干預或服務器死亡;
若是RegionServer得到關閉Region請求,它會關閉該Region並通知Master。Master將該Reguib移至CLOSED狀態並從新分配給其它的RegionServer;
在分配Region以前,若是Region處於CLOSED
狀態,Master會自動將Region轉換爲OFFLINE
狀態;
當一個RegionServer即將分裂(split)一個Region時,它通知Master,Master將Region從OPEN
轉換爲SPLITTING
狀態,並將要建立的兩個新Region添加到RegionServer。這兩個Region最初處於SPLITTING_NEW
狀態。
在通知Master後,RegionServer開始分裂Region。一旦通過了不返回的地方,RegionServer會再次通知Master,以便Master能夠更新hbase:meta表。無論怎樣,在服務器通知分裂完成以前,Master不會更新Region的狀態。若是分裂成功,則分裂的Region從SPLITTING
轉換爲SPLIT
狀態,而且兩個新的Region從SPLITTING_NEW
轉換爲OPEN
狀態。
若是分裂失敗,則分裂Region將從SPLITTING
回到OPEN
狀態,而且建立的兩個新的Region將從SPLITTING_NEW
轉換爲OFFLINE
狀態;
當一個RegionServer即將合併(merge)兩個Region時,它首先通知Master,Master將兩個待合併的Region從OPEN
轉換爲MERGING
狀態,並將擁有兩個合併的Region內容的新的Region添加到並添加到RegionServer。新的Region最初處於MERGING_NEW
狀態。
通知Master後,RegionServer開始合併這兩個Region。一旦通過不返回的地方,RegionServer再次通知Master,以便Master能夠更新META表。可是,Master不會更新Region狀態,直到RegionServer通知合併已完成。若是合併成功,則兩個合併的 Region將從MERGING
狀態變爲MERGED
狀態,而且新的 Region 將從MERGING_NEW
轉換爲OPEN
狀態;
若是合併失敗,則將兩個合併的Region從MERGING
更改回OPEN
狀態,而且建立的用於容納合並Region內容的新的Region將從MERGING_NEW
轉換爲OFFLINE
狀態。
對於處於FAILED_OPEN
或FAILED_CLOSE
狀態的Region,Master在經過HBase Shell從新分配它們時嘗試再次關閉它們。
瞭解Region的狀態變化過程十分重要,由於Region的狀態在發生更改時,若是發生異常,極可能須要管理員人工介入。而在人工介入以前,頗有可能會影響到部分表的正常使用,示例可參見:(HBase 部分表沒法寫入數據的異常處理)[https://blog.csdn.net/t894690230/article/details/78508862]