概述
HBase是一个K/V
存储型NoSQL数据库,与一般k/v数据库不同的是,Hbase的value
由rowkey
、column family
:qualifier
和TimeStamp
这个三个维度快速定位。
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
中。