[Binospace] HBase性能优化1—使用Filter降低客户端压力

一般我向别人介绍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。

 

? View Code JAVA
 
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");

文章的脚注信息由WordPress的wp-posturl插件自动生成

猜你喜欢

转载自57832638.iteye.com/blog/2022811