rowKey设计需要遵循三大原则:
- 唯一性原则
rowkey在设计时必须保证其唯一性,这是由于HBase的核心存储结构是KeyValue形式,在同个版本表格的情况下,如果后添加的rowkey与已有的相同,则会覆盖原先的数据。
补充:
排序原则
在Hbase中,rowkey是按照Ascll的顺序排序存储的,因此在rowkey的设计时,要充分利用这个特点,将经常读取的数据存储到一块,将最近可能会被访问的数据存储到一起。
- 长度原则
rowkey是一个二进制码流,可以是任意字符串,最大长度为64k,实际应用中一般为10-100byte,以byte[]形式保存,一般设计为定长,建议越短越好,不超过16个字节。这是由于Hbase的数据持久化文件HFiile是按照KeyValue形式存储,rowkey设计过长的话,在大量数据存储的情况下,rowkey会占用大量存储空间,极大影响HFile的存储效率;MemStore将缓存部分数据到内存中,rowkey过长,内存的有效利用率就会降低,从而导致系统不能缓存再多的数据,降低检索的效率。
- 散列原则
即让rowkey没有任何规律,从而实现设计的rowkey均匀的分布在每个Hbase节点上。就以常见的时间戳为例,如果rowkey按照时间戳的方式递增,那么不要将时间戳设计到第一部分,以避免所有的数据集中在一个RegionServer上,造成热点堆积导致的单个RegionServer负载过高的问题,从而提高查询效率。
可以以一下几种方法解决:
1). 加盐
如果rowkey按照时间戳的方式递增,则可以在rowkey前增加随机数,以避免热点堆积。
2). 哈希散列
哈希会使同一行永远用一个前缀加盐。哈希也可以使负载分散到整个集群,但是读却是可以预测的。使用确定的哈希可以让客户端重构完整的rowkey,可以使用get操作准确获取某一个行数据。
3). 反转
反转固定长度或者数字格式的rowkey。这样可以有效的随机rowkey,但是会牺牲rowkey的有序性。
4). 时间戳反转
快速获取数据的最近版本,使用反转的时间戳作为rowkey的一部分。