HBase的模式设计过程中应考虑的因素
- 这个表应该有多少列簇
- 列簇使用什么数据
- 每个列簇应该有多少列
- 列名是什么,尽管列名不必在建表的时候定义,但是读写数据是需要知道的。
- 单元应该存放什么数据
- 每个单元存储多少个时间版本
- 行键(RowKey)结构是什么,应该包含什么信息
HBase模式设计需要主要两个关键点
Join
HBase中没有Join的概念。不支持Join操作,而在不少业务需求中,需要使用Join操作。而大表结构可以解决这一问题。只需要一条记录加上一个特定的行关键字,就可以实现把所有关于Join的数据合并在一起
2.RowKey
RowKey非常重要,在设计时需要慎重考虑。以存储用户观影记录数据为例,复合的RowKey有用户ID作为前缀(方便把某用户的观影记录聚合在一起),倒置的时间串作为RowKey的后缀可以使观影记录数据从新到旧排列。如果RowKey是整形的,用二进制的方式应该比用String来存储一个数据更节约空间。
RowKey设计
RowK ey设计是最重要的事情,应该基于预期的访问模式来为RowKey建模。Rowkey决定了访问HBase表时可以得到的性能。原因有两个:Region基于RowKey为一个区间的行提供服务,并且负责区间的每一行;HFile在硬盘上存储有序的行。RowKey的有序特性和底层存储格式可以保证HBase表在设计RowKey之后的良好性能。
- RowKey是以字典顺序从大到小排序
原生HBase只支持从小到大的排序,但是现在有个需求想展现影片热度排行榜。这就要实现从大到小排列。针对这情况可以采用RowKey=Integer.MAX_VALUE-Rowkey的方式将Rowkey进行转换。
2.RowKey尽量散列RowKey设计
要保证散列,这样就会保证所有的数据都不是在一个Region上,从而避免读写的时候负载会集中在个别Region上。
3.RowKey的长度尽量短
- 时间使用Long来表示
- 尽量使用编码压缩
列簇定义
在物理上,一个列簇的成员在文件系统上都存储在一起。现在HBase并不能很好地处理两个或三个以上的列簇,所有尽量减少列簇数量。目前,flush和compaction操作是针对一个Region的,compaction操作现在是根据一个列簇下全部文件的数量触发的。
可配置的数据块大小,默认是64KB,在表实例化时设置数据块大小
数据块缓存(IN_MEMORY)
布隆过滤器
数据压缩
压缩编码:LZO,SNAPPY,GZIP
单元时间版本
默认每个单元格维护三个时间版本。如果只需要一个版本,在创建表可以直接将VERSIONS参数设置为1.
create 'mytable',{NAME => 'colfam1',VERSIONS => 5,MIN_VERSIONS =>'1', TTL=>'18000')
在列簇上同时设定TTL非常有用,如果当前存储的所有时间版本都早与TTL,至少MIN_VERSIONS个最新版本会保留。
生存时间
可以禁用TTL,或者通过设置值为INT.MAX_VALUE(2147473647)让它永远启用,这也是默认值,单位为秒