Region
Region是HBase數據管理的基本呢單位。數據的move,數據的balance,數據的split,都是按照region來進行操作的。
region中存儲這用戶的真實數據,而爲了管理這些數據,HBase使用了RegionSever來管理region。
尋址過程
數據尋址的一般過程如下,請參照:
zookeeper hbase:meta table table
+--------+ +--------------+ +--------------+
| | ----------> | | ---+ | |
+--------+ +--------------+ | +--------------+
hbase:meta | | | | |
location +--------------+ | +--------------+
| | +-----> | row |
+--------------+ +--------------+
row per table region | |
+--------------+
| |
+--------------+
| |
+--------------+
1. zookeeper node節點上作爲master管理着hbase:meta 的location
2. 客戶端通過zookeeper獲得region server的地址
3. region的信息獲取後,數據的信息亦可獲取
4. 客戶端返回查詢結果
region name
HBase的region name是由以下三部分做成:
userTableName + , + startKey + , + regionID
而regionID是由apache.org隨機生成的,具體是timestamp+.+MD5
比如:
test1,r6786520,1456410376247.fc9bdcb4f88aec2e64b393fece99cf0e.
test1: table name
r6786520: startKey
1456410376247.fc9bdcb4f88aec2e64b393fece99cf0e: regionID
1456410376247:timestamp型轉成long的數值型
fc9bdcb4f88aec2e64b393fece99cf0e: md5加密算法生成的ID
Region數
一般,region數如果沒有事前使用hbase shell來明示定義的話,算上系統的region數,一般只有3個:
1. hbase:meta
2. hbase:namespace
3. userRegion
因爲默認的region大小是10G,一般小型的環境下,數據量很難快速達到數據分裂的閾值。
明示的去指定的話,region數可以根據自己業務增加的趨勢實現選定一個峯值,這樣在加上設計一個優秀的rowkey,數據分佈比較均衡,整個集羣的性能纔是最優的。
疑惑:
1.在事前指定region數的情況下,region分割點選取的startkey是根據什麼選擇的,這個不明白。實際測試時發現,當region數指定爲5時,startkey~endkey的分佈如下所示:
region1:-#INF~33333333
region2:33333333~66666666
region3:66666666~99999999
region4:99999999~cccccccc
region5:cccccccc~+#INF
rowkey
hbase的數據分佈以及數據的操作,都是根據rowkey來劃分的,如果rowkey設計不合理的,到時候數據會分佈在一個region上,導致負載不均衡,IO請求加劇,用戶的體驗感瞬間下降,延遲增大。所以,一般rowkey不建議使用timestamp,字母等其他的混合,最好採用散列hase,使用MD5之類的生成,這樣纔會數據分佈均衡。