宽表:行少列多
高表:行多列少
hbase的row key是分布式的索引,也是分片的依据
hbase的row key+column family +column qualifier +timestamp+value是Hfile的排序依据。Hfile据此,对数据的索引到data block级别,而不是行级别,所以这种key是Hfile内部粗粒度(data block粒度)本地索引的关键。
1、查询性能:高表好,应为查询条件都在row key中,是全局分布式索引的一部分,高表一行中的数据较少。所以查询缓存blockCache能缓存更多的行,以行为单位的吞吐量会高
2、分片能力:高表分片粒度更细,各个分片的大小更均衡,高表一行数据较少,宽表一行数据较多,HBase以行来分片
3、元数据开销:高表元数据开销更大。高表行多,row key多,可能造成region数量也多,root meta表数据量也多,过大的元数据开销,可能引起HBase集群的不稳定,master更大的负载
4、事务能力:宽表事务能力好,HBase对一行的写入是有事务原子性的,一行所有的列要么全部写入成功,要么全部写入失败,而多行之间没有事务性保障
5、数据压缩比:如果我们对一行的数据压缩,宽表能获得更好的压缩比,在宽表中,一行的数据量叫多,相同的二进制字节较多,有利于提高压缩比,通过压缩,缓解一行数据量太大,而导致分片大小不均匀的情况。查询时我们通过row key找到压缩后数据,进行解压缩,而解压缩可以通过协处理器coproessor在HBase服务器上做,而不是在业务应用的服务器上做,以充分应用HBase集群的CPU能力
设计表时,尽量在两种之间平衡
数据块小 索引大,占用更多的内存,随机查找性能更好
数据块大 索引小,一次加载更多的HFile数据,序列扫描性能好
HFile数据块大小可以在列族层次设置,这个数据块不同于HDFS,默认为65535字节(或65KB),数据块索引村存储每个HFile数据块的起始键,数据块大小设置影响数据块索引的大小。
设置方式:
create 't8',{NAME =>'zs',BLOCKSIZE => '65535'}
把数据放入缓存,并不一定能够提升性能,如果一个列族只能被顺序化的扫描访问或很少被访问,则get scan 较长时间是可以接受的,这种情况下可以选择关闭列族的缓存
但这些不必要的数据加入缓存,会导致缓存滥用,从而把本应该放入缓存的数据排挤出去,如果关闭缓存,可以避免上述情况
数据块缓存默认是打开的,可以新建或修改表时关闭数据块缓存属性
create 'mytable', {NAME => 'colfam1', BLOCKCACHE => 'false' }
IN_MEMORY参数默认为false,该值表示HBase除了在数据块中保存这个列族比其他更激进外,没其他特殊效果,作用不大
create 'mytable', {NAME => 'colfam1', IN_MEMORY => 'true'}
布隆过滤器可以运用在块上,检查行键,也可以应用在行内的单元格上,当访问某列表示符时先使用同向的反向检测
布隆过滤器允许对存储在每个数据块的数据做一个反向检测。查询行时,先查询布隆过滤器,看看该行是否存在这个数据块,要么返回该行不存在,要么返回不知道。
存储这个额外的索引层需要占用额外的空间,占用大小随着索引数据增长而增长,所以行级布隆过滤器比列标识符级布隆过滤器占用空间要小。当空间不是问题时,可以压榨整个系统的性能潜力。
hbase(main) > create 'mytable' , {NAME=>'colfam1', BLOOMFILTER => 'ROWCOL' }
ROW:表示行级布隆过滤器(检查rowkey存不存在)
ROWCOL:表示列标识符级布隆过滤器
数据压缩有助于节省磁盘空间,但读写数据时的压缩和解压会提高CPU使用率,除非确定压缩不会提升系统性能,否则推荐打开表压缩
需要配置
create 'mytable' , {NAME => 'colfaml' , COMPRESSION => 'SNAPPY'}
create 'mytable' , { NAME => 'colfaml' , VERSION => 1, TTL => '18000'} //生存周期默认单位秒,默认永久保存
指定列族最少时间版本数
create 'mytable' , { NAME => 'colfaml' , VERSION => 5, MIN_VERSIONS => '1' }
{NAME => ‘cf’, MIN_VERSIONS => ‘0’}还可以进行数据清理,全部删除