一般我向别人介绍HBase的时候,都会这样说:
Hbase是加强版的Mysql,存储容量更大、逻辑形式更加灵活。至于BigTable那篇论文的内容,它的意义在于提供了一种更加灵活地组织数据的形式。Hbase以Distributed、Sorted RowKey、MultiDimentional作为亮点,吸引了如Facebook、Amazon、Taobao在内的一大批Internet公司的使用。HBase虽然开源,但是要真正使得你的业务run得漂亮,也不是容易的事情。本系列文章的作者,正是在HBase的使用过程中的一种积累。
1、如何更快Scan一个table中所有的的RowKey
- 建表时确定如果确定table的rowkey范围和大致的分布,在建立表格的时候,确定Region的划分。因为如果不划分Region,请降低参数hbase.hregion.max.filesize的值,让HRegion可以尽快分裂。
- 为Scan添加FirstKeyOnlyFilter。这样做的好处,可以避免扫描Rowkey时,把所有的column都读取到CLient端。
- 如果需要读取Rowkey下的部分Column,可以为Get操作增加ColumnCountGetFilter。
HTable table = new HTable(tableName); table.setScannerCaching(100); table.setAutoFlush(false); Scan s = new Scan(); s.setFilter(new FirstKeyOnlyFilter()); s.setBatch(100); ResultScanner rs = table.getScanner(s); long startTime = System.currentTimeMillis(); System.out.println(startTime); for (Result rr = rs.next(); rr != null; rr = rs.next()) { Get g = new Get(rr.getRow()); g.setFilter(new ColumnCountGetFilter(100)); System.out.println(Bytes.toString(rr.getRow())); NavigableMap> valueMap = table.get(g).getNoVersionMap(); for (byte[] family:valueMap.keySet()) { int i = 0; for (byte[] val: valueMap.get(family).values()) { System.out.println(Bytes.toString(val)); } } } System.out.println((System.currentTimeMillis()- startTime) + "ms"); |
From Binospace, post HBase性能优化1—使用Filter降低客户端压力
文章的脚注信息由WordPress的wp-posturl插件自动生成