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加盐,再配合使用预分区,既可以解决热点问题

发布了233 篇原创文章 · 获赞 211 · 访问量 90万+

猜你喜欢

转载自blog.csdn.net/fgyibupi/article/details/102922690