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之类的生成,这样才会数据分布均衡。




Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐