HBase使用总结
1、 使用压缩存储
HBase用于大规模的数据管理,数据一般会达到TB级,量级一般会达到billion级,如果不采用压缩模式管理数据会大大的增加HDFS的存储及NameNode的管理压力,LZO压缩是HDFS支持的压缩格式,可以将数据压缩到50%左右,并且压缩和解压速度相比zip等模式要快。在HBase使用LZO压缩前需要做以下准备:
1、 安装lzo-2.04-1.el5.rf.x86_64.rpm和lzo-devel-2.04-1.el5.rf.x86_64.rpm
2、 将lzo的jar包hadoop-lzo-0.4.10.jar复制到HBase安装目录的lib下
3、 创建HBase表时在列簇的配置中加入COMPRESSION=> 'LZO'
通过以上的配置就可以采用lzo格式压缩表中存储的数据,解压速度快有利于查询速度的提高。
2、 表的存储设计
HBase表的构成有以下几个部分:
1、 Row Key: 行键,Table的主键,Table中的记录按照Row Key字典排序排序
2、 Column Family:列簇,Table在水平方向有一个或者多个ColumnFamily组成,列簇不可以动态添加,列簇是数据的集中存储单元,一个列簇不会被分割。
3、 Column:列,列是列簇的子集,一个列簇中可以动态扩展多个列,因为列具有动态扩展的能力,因此设计表时,尽量考虑将具有共同特性的列集中到一个列簇管理,一方面可以方便检索,通过指定列簇将所有的列按照整体取出。另一方面可以加快检索速度,只需要检索一个region就可以找到所有需要的数据。
4、 TimeStamp:时间戳,每次数据操作对应的时间戳,可以看做是数据的version number,相同数据的多个时间戳版本按照long型排序,并且具有很高的查询速度。
5、 MaxVersion:最大版本值,在数据进行存储时,同一个值的多个版本是并存的,并且可以提供查询,这是HBase我最喜欢的特性,使用MaxVersion可以限定存储和查询的最大版本值,超过这个值的版本不可被查询,并且在数据整理时被删除。
6、 Time To Live(TTL):数据存储生命周期,设置表中数据的生命周期,超过该周期的数据将被自动删除。
7、hbase.hregion.max.filesize:region的最大文件大小,超过这个配置region将被split,若想减少region被分割的次数应尽量将该值调大,该值可以再配置文件中做整体配置,同时也可以通过修改单个表的配置进行个性化设定,通过MAX_FILESIZE 进行设置。
设计时应注意,不要在一张表中定义太多的Column Family,一方面是分布在多个Column Family中的数据不利于查询,另一方面,一个Column Family在flush的时候会触发其他的ColumnFamily进行flush,这样会加重IO。
注:HBase存储的抽象化形式
SortedMap<RowKey,List<Column,SortedList<Value,Version>>>
3、 数据查询及操作
一、HBase的查询操作分为以下几种:
1、通过RowKey访问,也就是通常的get操作,可以get单个column的值也可以整个列簇所有列的值
2、 通过range的scan在一定的范围内进行扫描,在进行scan是需要进行优化,通过Scan Caching来加快scaner的速度,默认情况下scaner是一条一条的对服务端数据进行scan,这个请求次数太多,效率较低,通过scan cache可以一次从服务端拿回指定数量的数据进行scan。注意因为RowKey存储时是按照字典排序,所有scan出来的数据也是按照字典排序的。
3、 通过RowKey,ColumnFamily,Column综合获取指定Value下的所有版本值,所有的值是按照TimeStamp进行排序的,可以使用TimeStamp集合也可以使用Value集合,这种查询的效率是相当高的,以前做个测试取得10W的版本值只需要150ms左右。在做整体的架构时必须考虑这个特性。另外注意HBase的ThriftServer中不提供这样查询的接口。
4、通过RowKey,Column Family,Column和指定的TimeStamp获取指定版本的唯一值。
二、数据处理:
1、数据批量导入:
在使用Hadoop批量导入时,可以在导入前预先分配一定量的region,这样可以加快批量导入的速度,根据以往的经验,如果不事先分配,并且导入的数据是有序的情况下会造成多个任务向一个region插入数据,这样会导致导入速度很慢,没有发挥Hadoop的特性。
2、数据删除:
HBase数据删除时有以下特性:
1)当通过RowKey,Column Family,Column删除一个值时,这个值将被整体删除,这样通过一般的get访问时数据是访问不到数据的。当插入新数据并且新数据的TimeStamp值高于当前时间,那么get操作会访问到新的插入值。
2)当通过RowKey,Column Family,Column和指定的TimeStamp删除数据时,小于该TimeStamp的所有版本的值将被认为是删除,但是通过get访问是有可能访问到最新的版本值。也可以通过指定TimeStamp的范围取得各个版本的集合。但是这种删除方式唯一的缺陷就是,当使用相同的TimeStamp再将这个值插入时,这个TimeStamp对于的值是无法访问的。
综合以上可以分析出,HBase的删除方式是通过插入一条删除记录来标记那些值是被删除的,删除操作TimeStamp的作用是标记小于等于这个TimeStamp的所有版本被删除,当进行查询时需要综合删除的记录来确定那些版本可以返回给用户,这种判断方式中删除记录有较高的优先级,这就能够解释当使用相同的TimeStamp再插入删除的记录时是不会在被访问到的。