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

七月 30th, 2012 by klose | Posted under 海量数据存储与处理.

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

友情提醒:在使用的Filter时,可能会造成RPC timeout的问题,因此建议大家注意观察是否有这样的Exception出现,如果的有的话,考虑调大hbase.rpc.timeout的值。

From Binospace, post HBase性能优化1—使用Filter降低客户端压力

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





Tags:

Comments

7 Responses to “HBase性能优化1—使用Filter降低客户端压力”
  1. Danielle 说道:

    Hey, stuble must be your middle name. Great post!

  2. Tirta 说道:

    And I was just wondeinrg about that too!

  3. linxxx3 说道:

    冰哥后面咋不接着写了,还等着2捏 :)

  4. www.94haha.com 说道:

    自从工作后就没来过了,今天偶然来访,越来越好了。

  5. 火车票预订 说道:

    分析的很透彻,很欣赏你的看法,学习了。

  6. 分析的很透彻,很欣赏你的看法,学习了。

Do you have any comments on HBase性能优化1—使用Filter降低客户端压力 ?