Hbase优化之RowKey设计

版权声明:版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lijingjingchn/article/details/83015594

1. Hbase的预分区

HBase默认建表时有一个region,这个region的rowkey是没有边界的,即没有startkey和endkey。在数据写入时,所有数据都会写入这个默认的region。随着数据量的不断增加,这个默认的region会越来越大,当达到某个阈值会自动split成为2个region。


2. Hbase的Rowkey设计

Hbase的RowKey设计,一般也需要参考预分区个数(或者预分区的个数通常根据RowKey的分布情况来设计),保证RowKey均匀分布到每个预分区上可以提供更好的Hbase读写性能。


3. 预分区及RowKey设计方案示例

本文使用的hbase集群有3个RegionServer,因此简单的将测试表TEST的预分区设置为3个,建表语句如下:

# Phoenix建表语句
# ----------------------------------------
CREATE TABLE "TEST" (
"row_key" varchar primary key,
"id_number" varchar,
"star_time" varchar,
"x_coordinate" varchar,
"y_coordinate" varchar
) SPLIT ON ('1','2');

4.1 RowKey设计原则

Salt
让数据均衡的分布到各个 Region 上,结合 pre-split,我们对查询键即 check 表的 check_id 求 hashcode 值,然后 modulus(numRegions) 作为前缀,注意补齐数据。

Hash 散列
因为 check_id 本身是不定长的字符数字串,为使数据散列化,方便 RowKey 查询和比较,我们对 check_id 采用 SHA1 散列化,并使之 32 位定长化。

唯一性
以上 salt+hash 作为 RowKey 前缀,加上 TEST表的start_time时间字段来保障 RowKey 唯一性。

最终生成RowKey如下:

# 使用`Salt+HASH(id_number)+start_time+collection_type`的组合作为RowKey。
# --------------------------------------------------------------------
# 生成的RowKey如下:
0fd5f3068412d587cd12ddeaf981e5c27201810101556120201

5. 查看数据分布情况

向TEST表插入数据,查看数据分布情况如下:

Name	Region Server	Start Key	End Key	Locality	Requests
TEST,,1539158154473.3f541e93e42a6bfbbff141ed4636ce38.	node5:16020		1	0.0	621
TEST,1,1539158154473.503b0c00b29aed14ec9e0e5dd1514ef3.	node6:16020	1	2	0.0	514
TEST,2,1539158154473.6929ab9e93e4592903011b48f1327d68.	node4:16020	2		0.0	600

猜你喜欢

转载自blog.csdn.net/lijingjingchn/article/details/83015594