HBase RowKey 设计

HBase RowKey 设计

设计 RowKey 的目的

HBase 中一条数据的唯一标识就是 RowKey,类似于关系型数据库中的主键,HBase 中的数据是根据 Row Key 的字典顺序来排序的。

那么这条数据存储于哪个分区,取决于 Rowkey 处于哪一个预分区的区间内,设计 Rowkey的主要目的 ,就是让数据均匀的分布于所有的 Region 中,在一定程度上防止数据倾斜,尽量在访问的时候不会出现热点现象

什么是热点问题

因为 HBase 中的行是按照 RowKey 的字典顺序排序的,这种设计使得 Scan 操作更为方便,但是也容易出现热点问题。

热点问题是大量的客户端只访问集群的一个或少数节点,大量访问请求会使该台机器的负载很高,直接导致性能下降,甚至 Region 不可用,而集群的其他节点却处于相对空闲的状态。

RowKey 特性

RowKey 最大的长度是 64KB

  • 字符串类型
  • 有明确含义
  • 有序性
  • 定长型
RowKey 设计原则
  • 长度原则

    RowKey 可以使任意字符串,最大长度 64KB,建议越短越好(建议在 10-100字节之间),最好不要超过 16 个字节,原因如下:

    • 目前操作系统都是 64 位系统,内存 8 字节对齐,控制在 16 字节,8 字节的整数倍可以利用操作系统的最佳特性
    • HBase 将部分数据加载到内存当中,如果 RowKey太长,内存的有效利用率就会下降
  • 唯一性原则

    RowKey 必须保证是唯一的,如果不唯一的话,同一版本同一个 RowKey 插入HBase 中会更新之前的数据

  • 散列原则

    • 加盐(盐表)

      在 RowKey 的前面增加随机数,散列之后的 RowKey 就会根据随机生成的前缀分散到各个 Region 上,可以有效的避免热点问题。加盐这种方式增加了写的吞吐,但是使得读数据更加困难

    • 哈希(Hash)

      Hash 算法包含了 MD5 等算法,可以直接取 RowKey 的 MD5 值作为 RowKey,或者取 MD5 值拼接原始 RowKey,组成新的RowKey,由于 RowKey 设计不应该太长,所以可以对 MD5值 进行截取拼接

    • 字符串反转

      • 时间戳反转
      • 手机号反转
      • ...
posted @ 2022-01-13 19:35  追こするれい的人  阅读(111)  评论(0编辑  收藏  举报