HBase rowkey设计原则

来源:互联网 发布:正在设置您的mac要多久 编辑:程序博客网 时间:2024/06/11 22:07

Hbase是三维有序存储的,通过rowkey、column key(column family和qualifier)、timestamp这三个维度可以对数据进行快速定位。

1、通过get方式,指定rowkey获取唯一一条记录。

2、通过scan方式,setStartRow和setEndRow参数进行范围匹配。

3、全表扫描。


rowkey特性

1. 字符串类型

HBase中rowkey存储是byte[],但是Java中建议设为String确保通用性,其他类型(如Long)数据类型的长度将限制rowkey 的长度

2. 有明确意义


3. 有序


4. 定长

有序的基础是定长,如果长度不一致,排序会发生变化。如20170101>2017040


rowkey设计原则

1. 唯一原则


2. 长度原则

rowkey是一个二进制码流,可以是任意字符串,最大长度64kb,以byte[]形式保存,一般保存成定长。

建议越短越好,不要超过16个字节,原因如下:

(1)数据的的持久化HFile中是按照KeyValue存储,如果rowkey过长会影响HFile的存储效率;

(2)MemStore将将缓存部分数据到内存,如果rowkey过长,内存的有效利用率就会降低,系统不能缓存更多的的数据,检索效率就会降低。

(3)目前系统一般都是64位的,内存8字节对齐,控制在16个字节,是8字节的整数倍利用了系统最佳特性。


3. 散列原则

必须在设计上保证其唯一性,rowkey是按照字段顺序排序存储的,因此,设计设计rowkey的时候要利用排序的特点,将经常读取的数据存到一块,将最新可能会被访问的数据存到一块。

rowkey顺序排序存储的好处:优化scan操作,可以将相关的行和可能会被同时读取的行存在临近位置,便于scan。rowkey设计不好就会造成热点。

热点:大量client同时访问集群的一个节点(或极少数节点)。访问可能是读或者写。大量访问热点region所在的节点,会导致机器超出承受能力,引起性能下降或不可用。也会影响同一个RegionServer上的其他region。


避免热点的方法:

加盐

给rowkey前加随机数。

哈希

同样是加前缀,可以使负载分散到整个集群,但是读却是可以预测的。

反转

反转固定长度或数字格式的rowkey(比如说timestamp),这样使rowkey中经常改变的部分(最没意义的部分)放在最前面,可以生成随机的rowkey,但是牺牲了有序性。


每条记录的RowKey,每个字段都需要填充到相同长度。