0%

hbase的rowkey设计

概述

HBase是一个K/V存储型NoSQL数据库,与一般k/v数据库不同的是,Hbase的valuerowkeycolumn family:qualifierTimeStamp这个三个维度快速定位。

HBase中rowkey可以唯一标识一行记录,在HBase查询的时候,有两种方式:

  • 通过get方式,指定rowkey获取唯一一条记录
  • 通过scan方式,设置startRow和stopRow参数进行范围匹配
  • 全表扫描,即直接扫描整张表中所有行记录

rowkey长度原则

rowkey是一个二进制码流,可以是任意字符串,最大长度64kb,实际应用中一般为10-100bytes,以byte[]形式保存,一般设计成定长。

建议越短越好,不要超过16个字节

rowkey散列原则

  • 尽量不要将rowkey设计成连续的值,如时间戳;
  • 为rowkey增加随机散列字段,使数据均衡分布在每个RegionServer;
  • 如果没有散列字段,所有的数据都会集中在一个RegionServer上,这样在数据检索的时候负载会集中在个别的RegionServer上,造成热点问题,会降低查询效率。

什么是热点?
热点发生在大量的client直接访问集群的一个或极少数个节点(访问可能是读,写或者其他操作)。大量访问会使热点region所在的单个机器超出自身承受能力,引起性能下降甚至region不可用.

rowkey唯一原则

必须在设计上保证其唯一性,rowkey是按照字典顺序排序存储的.

设计方法

  • Salting: 指将随机数据添加到行键的开头。
  • Hashing: 哈希会使同一行永远用一个前缀加盐。
  • 反转: 以手机号为rowkey,可以将手机号反转后的字符串作为rowkey
  • 时间戳反转: Long.Max_Value - timestamp
  • 尽量保持 ColumnFamily 名称尽可能小,最好是一个字符
  • 虽然详细的属性名称更易于阅读,但更喜欢使用较短的属性名称来存储在HBase中。

参考链接