HBase的RowKey与列族设计原则

Roekey设计原则:

1)Rowkey的长度原则: 是一个二进制码流,Rowkey 的长度被很多开发者建议说设计在10~100 个字节,不过建议是越短越好,不要超过16 个字节。

2)Rowkey散列原则:如果Rowkey 是按时间戳的方式递增,不要将时间放在二进制码的前面,建议将Rowkey的高位作为散列字段,由程序循环生成,低位放时间字段,这样将提高数据均衡分布在每个Regionserver 实现负载均衡的几率。如果没有散列字段,首字段直接是时间信息将产生所有新数据都在一个 RegionServer 上堆积的热点现象,这样在做数据检索的时候负载将会集中在个别RegionServer,降低查询效率。

3)Rowkey唯一原则:必须在设计上保证其唯一性。

列族设计原则:

    (1)一般不建议设计多个列族。具体原因如下

假如HBase表的表设置两个列族,若已一个列族1000万行,另一个列族100行。当一个要求region分裂时候,会导致100行的列会同样分布到多个region中。这样就出现基数问题,会导致扫描列族A的性能低下。某个列族在flush的时候,它邻近的列族也会因关联效应出发flush,最终导致系统产生更多的I/O。

HBase本身的设计目标是支持稀疏表,而稀疏表通常会有很多列,但是每一行有值的列又比较少。在HBase中Column Family的数量通常很小,同时HBase建议把经常一起访问的比较类似的列放在同一个Column Family中,这样就可以在访问少数几个列时,只读取尽量少的数据。

在设计Hbase schema的时候,要尽量只有一个column family,至于为什么主要从flush和compaction说起,它们触发的基本单位都是Region级别,所以当一个column family有大量的数据的时候会触发整个region里面的其他column family的memstore(其实这些memstore可能仅有少量的数据,还不需要flush的)也发生flush动作;另外compaction触发的条件是当store file的个数(不是总的store file的大小)达到一定数量的时候会发生,而flush产生的大量store file通常会导致compaction,flush/compaction会发生很多IO相关的负载,这对Hbase的整体性能有很大影响,所以选择合适的column family个数很重要。

(2)数据块缓存配置

如果经常顺序访问或者很少访问,可以关闭列族的缓存,让BLOCKCACHE 参数设置false,列族缓存默认打开。

>create 'mytable',{NAME=>'colfam1',BLOCKCACHE=>'false'}

(3)激进缓存配置

可以选择一个列族赋予更高的缓存,该参数IN_MEMORY 设置true。列族默认的关闭的。如果你预期一个列族比另一个列族的随机读更多,这个特性迟早用的上。

>create 'mytable',{NAME=>'colfam1',IN_MEMORY=>'true'}

(4)布隆过滤器(BLOOMFILTER)设置

减少硬盘读取数据带来的开销。对存储的数据块做反向测试,占用额外的空间。

布隆过滤器随着它们索引的对象数据的增长而增长,所以行级布隆过滤器比列限定符级布隆过滤器占用空间要少。当空间不是问题时,它们可以帮助你“榨干”系统的性能潜力。

>create 'mytable',{NAME=>'colfam1',BLOOMFILTER=>'ROWCOL'}

BLOOMFILTER默认参数为NONE。一个行级布隆过滤器用ROW启动,列限定级布隆过滤器用ROWCOL启动。行级布隆过滤器在数据快里检查特定行键是否存在,列限定符级布隆过滤器检查行与列限定符组合是否不存在。ROWCOL布隆过滤器的开销高于ROW布隆过滤器。

(5)生产时间配置

超过这个时间设置的就会在下一次大合并中被删除。TTL =>"18000"。你可以禁用TTL,或者通过设置其值为INT.MAX_VALUE(2147483647)让它永远启用(这是默认值)。

>create 'mytable',{NAME=>'colfam1',TTL=>'1800'}

(6)列族压缩

压缩可以节省空间,读写数据会增加CPU的使用率 LZO,SNAPPY,GZIP(不常用)。

>create 'mytable',{NAME=>'colfam1',COMPRESSION=>'SNAPPY'}

注意,数据只在硬盘上是压缩的,在内存(MemStore或BlockCache)或通过网络传输是是没有压缩的。

(7)单元时间版本

默认为3个版本,来保存历史数据。如果只需要哟个版本,推荐设置表时只维护一个版本。

>create 'mytable',{NAME=>'colfam1',VERSION=>1,TTL=>'1800'}

也可以指定列族存储的最少时间版本数:

>create 'mytable',{NAME=>'colfam1',VERSION=>5,MIN_VERSIONS=>'1'}

 

posted @ 2017-03-24 09:54  跳出  阅读(3925)  评论(0编辑  收藏  举报