Hbase的预分区及RowKey的设计

1. 为什么要使用预分区

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


2. 不使用预分区存在的问题

  1. 写热点问题(所有新数据都往一个region上写);

    首先,是热点写,我们总是会往最大的start-key所在的region写东西,因为我们的rowkey总是会比之前的大,并且hbase的是按升序方式排序的。所以写操作总是被定位到无上界的那个region中。

    其次,由于写热点,我们总是往最大start-key的region写记录,之前分裂出来的region不会再被写数据,有点被打进冷宫的赶脚,它们都处于半满状态,这样的分布也是不利的。

  2. region split会消耗宝贵的集群I/O资源

    如果在写比较频率的场景下,数据增长快,split的次数也会增多,由于split是比较耗时耗资源的,所以我们并不希望这种事情经常发生。


3. 解决方法(预分区)

在集群的环境中,为了得到更好的并行性,我们希望有好的load blance,让每个节点提供的请求处理都是均等的。我们也希望,region不要经常split,因为split会使server有一段时间的停顿,如何能做到呢?

在建表的时候可以创建多个空region,并确定每个region的起始和终止rowky,这样只要我们的rowkey设计能均匀的命中各个region,就不会存在写热点问题。自然split的几率也会大大降低。当然随着数据量的不断增长,该split的还是要进行split。

随机散列与预分区。二者结合起来,是比较完美的,预分区一开始就预建好了一部分region,这些region都维护着自已的start-end keys,再配合上随机散列,写数据能均等地命中这些预建的region,就能解决上面的那些缺点,大大地提高了性能。


4. 预分区及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
发布了12 篇原创文章 · 获赞 3 · 访问量 2万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览