hbase 预分区Pre-splitting 解决热点问题

欢迎关注本人公众号

在这里插入图片描述

预分区

在创建表时我们可以指定分区数量及规则等信息。

最简单的方法是在创建表时指定分割点数组。 请注意,将字符串文字指定为拆分点时,它们将基于字符串的基础字节表示形式创建拆分点。 因此,当指定分割点“ 10”时,实际上是在指定字节分割点“ \ x31 \ 30”。

分割点将定义n + 1个区域,其中n是分割点的数量。 第一个region包含从最小的可能rowkey到最大但不包括第一个分割点所有rowkey,这里之所以说最大最小是因为hbase中rowkey是有序排列的。
下一个region将包含从第一个分割点到下一个分割点的rowkey,但不包括下一个分割点的rowkey。 以此类推。 从最后的分割点到最大可能的rowkey将定义最后一个region。
从上面可以看到,每个region是一个闭开区间[)

SPLITS

实例, 创建一个有4个预分区的表:

hbase(main):003:0> create 't1','f',SPLITS => ['10','20','30']
Created table t1
Took 2.9684 seconds                                                                                                                                                                                                                                                           
=> Hbase::Table - t1

请注意,第一个区域将包含从’\ x00’到’\ x30’的所有键(因为’\ x31’是’1’的ASCII码)。
在这里插入图片描述

SPLITS_FILE

还有一个方法是在文件中指定分区规则:
我们创建一个分区规则文件(注意不能有空行):

[root@node1 hbase-2.1.5]# cat splits.txt 
10
20
30
40

然后通过文件的方式指定预分区规则

hbase(main):007:0> create 't14','f',SPLITS_FILE=>'/data/program/hbase-2.1.5/splits.txt'
Created table t14
Took 1.3536 seconds                                                                                                                                                                                                                                                           
=> Hbase::Table - t14

根据所需的区域数量和分割算法自动计算分割

# 根据随机字节键创建具有四个分region的表
hbase>create 't2','f1', { NUMREGIONS => 4 , SPLITALGO => 'UniformSplit' }

# 根据16进制键创建具有四个分region的表
hbase>create 't3','f1', { NUMREGIONS => 5, SPLITALGO => 'HexStringSplit' }

在运行过程中region会进行拆分。关于region拆分后面再写。

热点问题的解决

出现热点问题原因

  1. hbase的中的数据是按照字典序排序的,当大量连续的rowkey集中写在个别的region,各个region之间数据分布不均衡;
  2. 创建表时没有提前预分区,创建的表默认只有一个region,大量的数据写入当前region;
  3. 创建表已经提前预分区,但是设计的rowkey没有规律可循,设计的rowkey应该由regionNo+messageId组成。

如何解决热点问题

解决这个问题,关键是要设计出可以让数据分布均匀的rowkey,与关系型数据库一样,rowkey是用来检索记录的主键。访问hbase table中的行,rowkey 可以是任意字符串(最大长度 是 64KB,实际应用中长度一般为 10-100bytes),在hbase内部,rowkey保存为字节数组,存储时,数据按照rowkey的字典序排序存储。

rowkey加盐

这里还涉及到rowkey加盐算法。加盐算法一般有反转、 随机数加盐、hash加盐

反转

直接将rowkey反转。
这种适合rowkey前面的部分变化不大,后面变化大的,最典型的例子是时间戳。反转后就随机了,再配合上面的预分区即可实现region均匀分布。

随机数加盐

在rowkey前拼接上随机数。

hash加盐(推荐)

获取rowkey的hash值,取后N为拼接在rowkey前。
推荐这种方法,因为不仅实现了region均匀分布,也可以实现精确查询,通过get精确定位,因为查询时可以通过算法直接计算出rowkey。

rowkey加盐,再配合使用预分区,既可以解决热点问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

快乐崇拜234

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值