Rowkey设计原理

Rowkey本身相当于一级索引。
三大原则:
唯一性原则:Rowkey在设计时必须保证其唯一性,这是由于HBase的核心存储结构是KeyValue形式,在同个版本表格的情况下,如果后添加的Rowkey与已有的相同,则会覆盖原先的数据(思:versions)。
补充:排序原则:在Hbase中,Rowkey是按照Ascll的顺序排序存储的,因此在Rowkey的设计时,要充分利用这个特点,将经常读取的数据存储到一块,将最近可能会被访问的数据存储到一起(思:最大值-时间戳)。

长度原则:Rowkey是一个二进制码流,可以是任意字符串,最大长度为64k,实际应用中一般为10-100byte,以byte[]形式保存,一般设计为定长,建议越短越好,不超过16个字节。这是由于Hbase的数据持久化文件HFiile是按照KeyValue形式存储,Rowkey设计过长的话,在大量数据存储的情况下,Rowkey会占用大量存储空间,极大影响HFile的存储效率;MemStore将缓存部分数据到内存中,Rowkey过长,内存的有效利用率就会降低,从而导致系统不能缓存再多的数据,降低检索的效率。

散列原则:即让Rowkey没有任何规律,从而实现设计的Rowkey均匀的分布在每个Hbase节点上。就以常见的时间戳为例,如果Rowkey按照时间戳的方式递增,那么不要将时间戳设计到第一部分,以避免所有的数据集中在一个RegionServer上,造成热点堆积导致的单个RegionServer负载过高的问题,从而提高查询效率。
解决:
加盐:如果Rowkey按照时间戳的方式递增,则可以在Rowkey前增加随机数,以避免热点堆积。
哈希散列:哈希会使同一行永远用一个前缀加盐。哈希也可以使负载分散到整个集群,但是读却是可以预测的。使用确定的哈希可以让客户端重构完整的Rowkey,可以使用get操作准确获取某一个行数据。
反转:反转固定长度或者数字格式的Rowkey。这样可以有效的随机Rowkey,但是会牺牲Rowkey的有序性。
时间戳反转:快速获取数据的最近版本,使用反转的时间戳作为Rowkey的一部分。

Rowkey设计直接关系到region划分(与划分策略有关),非常关键。不同的Rowkey决定了,row写入哪个分区当中。
需求调研的关键维度:
负载特点:读写的系统吞吐量,读写比重。重读轻写Rowkey更侧重高效读取,重写轻读更侧重整体的吞吐量。
查询场景:最高频的查询场景,最有价值的数据排序场景,各个字段的匹配类型(equal,prefix match,wildcard,text-search),组合字段场景。
数据特点:查询条件字段的数据分布特点,数据的生命周期。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值