HBase怎么查询同一条记录多个版本数据
(1)Hbase shell命令模式
get 'stu','rk01', {COLUMN => 'info:name', VERSIONS => 5} |
(2)JAVA API 模式
Get get = new Get("rk01".getBytes()); get.addColumn("info".getBytes(), "name".getBytes()); get.setMaxVersions(5); rs = tTable.get(get); |
HBase过滤器实现原则
采用bloomfilter进行过滤,Bloom Filter是一种空间效率很高的随机数据结构
(1)BLOOMFILTER在HBase的作用
HBase利用 BLOOMFILTER来提供随机读(GET)的性能,对于顺序读(Scan),设置BLOOMFILTER是没有作用的。
(2)BLOOMFILTER在HBase的开销
BLOOMFILTER是一个列族级别的配置,如果你表中设置了BLOOMFILTER,那么HBase在生成StoreFile时候包含一份BLOOMFILTER的结构数据,称为MetaBlock;开启BLOOMFILTER会有一定的存储以及内存的开销。
(3)BLOOMFILTER如何提供随机读(GET)的性能
对于某个region的随机读,HBase会遍历读memstore及storefile(按照一定的顺序),将结果合并返回给客户端。如果你设置了bloomfilter,那么在遍历读storefile时,就可以利用bloomfilter,忽略某些storefile。
(4)Region的StoreFile数目越多,BLOOMFILTER效果越好
(5)Region下的storefile数目越少,HBase读性能越好
HBase短时间批量导入数量过多的话就会被锁,该怎么办?
通过调用 HTable.setAutoFlush(false)方法可以将 HTable 写客户端的自动 flush关闭, 这样可以批量写入数据到 HBase, 而不是有一条 put 就执行一次更新, 只有当put 填满客户端写缓存时, 才实际向 HBase 服务端发起写请求。默认情况下 auto flush是开启的。
HBase怎么预分区
预分区的目的主要是在创建表的时候指定分区数,提前规划表有多个分区,以及每个分区的区间范围,这样在存储的时候rowkey按照分区的区间存储,可以避免region热点问题。
通常有两种方案
方案1:shell 方法
create 'tb_splits', {NAME => 'cf',VERSIONS=> 3},{SPLITS => ['10','20','30']}
方案2: JAVA程序控制
l 取样,先随机生成一定数量的rowkey,将取样数据按升序排序放到一个集合里
l 根据预分区的region个数,对整个集合平均分割,即是相关的splitKeys.
l HBaseAdmin.createTable(HTableDescriptor tableDescriptor,byte[][]splitkeys)可以指定预分区的splitKey,即是指定region间的rowkey临界值.