好贷网好贷款

Hbase优化之七

发布时间:2016-12-4 20:23:41 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"Hbase优化之七",主要涉及到Hbase优化之七方面的内容,对于Hbase优化之七感兴趣的同学可以参考一下。

[转载]HBase性能优化 0 使用Filter降低客户端压力 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"); 使用Coprocessor进行RowCount统计 对于Table内RowKey个数的统计,一直是HBase系统面临的一项重要工作,目前有两种执行该操作的方式。 1)使用MapReduce进行。可以借助HTableInputFormat实现对于Rowkey的划分,但是需要占用资源,另外由于使用的Hadoop集群提交作业,经常会遇到不能申请到资源的情况,延迟较大,不适合应用的频繁访问。 2)使用Scan+KeyOnlyFilter的方式进行。可以借助Filter的功能,尽可能实现数据在RegionServer端进行统计,减轻Client端的压力。但是,在大多数情况下,从每一个Region上进行Scan,当Table较大时,会造成非常长的延迟,用户体验下降。 基于此,我们考虑到了Coprocessor这样的新特性。 操作上,HBase-0.92.1提供了 org.apache.hadoop.hbase.coprocessor.AggregateImplementation,我们需要对于某一个Table注册该Coprocessor,具体做法为: 通过shell修改表的属性,支持coprocessor: alter 'T_XXXX', METHOD => 'table_att','coprocessor'=>'|org.apache.hadoop.hbase.coprocessor.AggregateImplementation||' ?View Code JAVA String coprocessClassName = "org.apache.hadoop.hbase.coprocessor.AggregateImplementation";   HBaseAdmin admin = new HBaseAdmin(HBaseConfiguration.create());   admin.disableTable(tableName);   HTableDescriptor htd = admin.getTableDescriptor(tableName);   htd.addCoprocessor(coprocessClassName);   admin.modifyTable(tableName, htd);   admin.enableTable(tableName); 然后执行的代码如下: Scan s = new Scan(); s.addColumn(Bytes.toBytes("cf1"), Bytes.toBytes("c1")); AggregationClient ac = new AggregationClient(HBaseConfiguration.create()); try { return ac.rowCount(tableName, new LongColumnInterpreter(), s); } catch (Throwable e) { // TODO Auto-generated catch block e.printStackTrace(); } return 0; 为了统计使用Scan增加KeyOnlyFilter和Coprocessor之间的区别,记录了500次操作的时间,性能对比图如下: 从上图中,可以看出,大部分通过Coprocessor获取RowCount个数的延迟,小于1s,而使用Scan的方式,获得RowKeyCount的个数大概在4~5s。(备注,检查的table的Rowkey的个数在3w左右)。 那么究竟是什么原因让Coprocessor在统计Rowkey的个数上,拥有如此明显的优势呢? 这是因为在Table注册了Coprocessor之后,在执行AggregationClient的时候,会将RowCount分散到Table的每一个Region上,Region内RowCount的计算,是通过RPC执行调用接口,由Region对应的RegionServer执行InternalScanner进行的。 因此,性能的提升有两点原因: 1) 分布式统计。将原来客户端按照Rowkey的范围单点进行扫描,然后统计的方式,换成了由所有Region所在RegionServer同时计算的过程。 2)使用了在RegionServer内部执行使用了InternalScanner。这是距离实际存储最近的Scanner接口,存取更加快捷。

上一篇:Java垃圾回收机制
下一篇:Jsp乱码图解

相关文章

关键词: Hbase优化之七

相关评论