表结构
Hbase的表有两种基本的键结构:行健(row key)和列键(column key)。
- 列键:包括了列族名和限定符,定位到列的索引
- 行健:相当于关系型数据库中的主键,通过行健得到逻辑布局中一行的所有列
每个行健在表中具有唯一性,可以用来查询正行数据,行健的值即代表着数据的位置,内容即索引的结构。
表至少包含一个列簇,每个列簇中可以包含一到多个单元格,每个单元格对应一个键值对,可以用列键查询一行中某个单元格的值。
Hbase采用列式存储方式,将一个列簇的数据存在一起,以单元格为单位将数据依次保存,每个单元格内部都要保存行健和列键的值,空值的单元格不存。
同一个单元格的不同版本被单独存储为连续的单元格,单元格按照时间戳降序排列,所以默认读取的是最新的单元格数据
同一列族的单元格在存储的时候先按行健排序,当一行中有多个单元格的时候再按列键排序,同一单元格有多个版本的时候按时间戳排序
根据以上的存储特性,建议在查询的时候指定列族信息可以有效减少查询的存储文件,提高效率
高表和宽表
Hbase包含两种表形式:高表和宽表,高表就是列少行多,宽表则反之
HBase只能按行切分,高表数据无法拆分,更无法进行HBase的负载均衡等特性,但高表便于用于一次更改多个列的值,Hbase具有行的原子性。
行健作用
数据是按照 Rowkey 的 ASCII 字典顺序进行全局排序的,由小到大排列
根据 RowKey 进行检索,通过 RowKey查找所在的 Region,然后向该 Region 获取数据。
结合实际的高频的查询场景来组合选择的字段,越高频的查询字段排列越靠左
设计原则
通用性原则
将行健设计成String类型,避免在不同系统环境下出现长度不一致现象;
长度原则
行健在列簇的每个单元格内都会保存一份,行健过长会浪费存储空间,推荐10-100字节
唯一性原则
必须在设计上保证其唯一性。
散列原则
设计的 RowKey 应均匀的分布在各个 HBase节点上,避免造成热点问题。
方法举例:
- 随机数,在rowkey的前面增加随机数,虽然增加了写操作的吞吐量,与此同时也增加了读操作的开销
- UUID
- Hash 散列或者 Mod 取模,Md5,等加密算法
- 业务有序数据方向(对业务数据进行reverse)