HBase的模式设计过程中应考虑的因素

  1. 这个表应该有多少列簇
  2. 列簇使用什么数据
  3. 每个列簇应该有多少列
  4. 列名是什么,尽管列名不必在建表的时候定义,但是读写数据是需要知道的。
  5. 单元应该存放什么数据
  6. 每个单元存储多少个时间版本
  7. 行键(RowKey)结构是什么,应该包含什么信息

HBase模式设计需要主要两个关键点

  1. 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之后的良好性能。

  1. 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)让它永远启用,这也是默认值,单位为秒

results matching ""

    No results matching ""