写点什么

HBase 的 rowkey 设计原则

作者:编程江湖
  • 2022 年 1 月 21 日
  • 本文字数:1511 字

    阅读完需:约 5 分钟

hbase 所谓的三维有序存储的三维是指:rowkey(行主键),column key(columnFamily+qualifier),timestamp(时间戳)三部分组成的三维有序存储。

rowkey 是行的主键,而且 hbase 只能用个 rowkey,或者一个 rowkey 范围即 scan 来查找数据。所以 rowkey 的设计是至关重要的,关系到你应用层的查询效率。

rowkey 是以字典顺序排序的,存储的是字节码。

Rowkey 设计原则

1.Rowkey 的唯一原则

必须在设计上保证其唯一性。由于在 HBase 中数据存储是 Key-Value 形式,若 HBase 中同一表插入相同 Rowkey,则原先的数据会被覆盖掉(如果表的 version 设置为 1 的话),所以务必保证 Rowkey 的唯一性.

2.Rowkey 的排序原则

HBase 的 Rowkey 是按照 ASCII 有序设计的,我们在设计 Rowkey 时要充分利用这点。比如视频网站上对影片《泰坦尼克号》的弹幕信息,这个弹幕是按照时间倒排序展示视频里,这个时候我们设计的 Rowkey 要和时间顺序相关。可以使用"Long.MAX_VALUE - 弹幕发表时间"的 long 值作为 Rowkey 的前缀。

3.Rowkey 的散列原则

我们设计的 Rowkey 应均匀的分布在各个 HBase 节点上。拿常见的时间戳举例,假如 Rowkey 是按系统时间戳的方式递增,Rowkey 的第一部分如果是时间戳信息的话将造成所有新数据都在一个 RegionServer 上堆积的热点现象,也就是通常说的 Region 热点问题, 热点发生在大量的 client 直接访问集中在个别 RegionServer 上(访问可能是读,写或者其他操作),导致单个 RegionServer 机器自身负载过高,引起性能下降甚至 Region 不可用,常见的是发生 jvm full gc 或者显示 region too busy 异常情况,当然这也会影响同一个 RegionServer 上的其他 Region。

Region 热点问题

1、Reverse 反转针对固定长度的 Rowkey 反转后存储,这样可以使 Rowkey 中经常改变的部分放在最前面,可以有效的随机 Rowkey。

反转 Rowkey 的例子通常以手机举例,可以将手机号反转后的字符串作为 Rowkey,这样的就避免了以手机号那样比较固定开头(137x、15x 等)导致热点问题,这样做的缺点是牺牲了 Rowkey 的有序性。

2、Salt 加盐 Salt 是将每一个 Rowkey 加一个前缀,前缀使用一些随机字符,使得数据分散在多个不同的 Region,达到 Region 负载均衡的目标。

比如在一个有 4 个 Region(注:以 [ ,a)、[a,b)、[b,c)、[c, )为 Region 起至)的 HBase 表中,加 Salt 前的 Rowkey:abc001、abc002、abc003 我们分别加上 a、b、c 前缀,加 Salt 后 Rowkey 为:a-abc001、b-abc002、c-abc003

可以看到,加盐前的 Rowkey 默认会在第 2 个 region 中,加盐后的 Rowkey 数据会分布在 3 个 region 中,理论上处理后的吞吐量应是之前的 3 倍。由于前缀是随机的,读这些数据时需要耗费更多的时间,所以 Salt 增加了写操作的吞吐量,不过缺点是同时增加了读操作的开销。

3、Hash 散列或者 Mod 用 Hash 散列来替代随机 Salt 前缀的好处是能让一个给定的行有相同的前缀,这在分散了 Region 负载的同时,使读操作也能够推断。确定性 Hash(比如 md5 后取前 4 位做前缀)能让客户端重建完整 RowKey,可以使用 get 操作直接 get 想要的行。

4.Rowkey 的长度原则

复制代码 Rowkey 长度设计原则:Rowkey 是一个二进制,Rowkey 的长度被很多开发者建议说设计在 10~100 个字节,建议是越短越好。

原因有两点:其一是 HBase 的持久化文件 HFile 是按照 KeyValue 存储的,如果 Rowkey 过长比如 500 个字节,1000 万列数据光 Rowkey 就要占用 500*1000 万=50 亿个字节,将近 1G 数据,这会极大影响 HFile 的存储效率;

其二是 MemStore 缓存部分数据到内存,如果 Rowkey 字段过长内存的有效利用率会降低,系统无法缓存更多的数据,这会降低检索效率;

需要指出的是不仅 Rowkey 的长度是越短越好,而且列族名、列名等尽量使用短名字,因为 HBase 属于列式数据库,这些名字都是会写入到 HBase 的持久化文件 HFile 中去,过长的 Rowkey、列族、列名都会导致整体的存储量成倍增加。


关键词:大数据培训

用户头像

编程江湖

关注

IT技术分享 2021.11.23 加入

还未添加个人简介

评论

发布
暂无评论
HBase的 rowkey 设计原则