hbase性能优化

1)配置

当你调用create方法时将会加载两个配置文件:hbase-default.xml and hbase-site.xml,利用的是当前的java类路径, 代码中configuration设置的这些配置将会覆盖hbase-default.xml和hbase-site.xml中相同的配置,如果两个配置文件都存在并且都设置好了相应参上面的属性下面的属性即可

2)关于建表

public void createTable(HTableDescriptor desc)

HTableDescriptor 代表的是表的schema, 提供的方法中比较有用的有

setMaxFileSize,指定最大的regionsize

setMemStoreFlushSize 指定memstoreflush到HDFS上的文件大小

增加family通过 addFamily方法

public void addFamily(final HColumnDescriptor family)

HColumnDescriptor 代表的是column的schema,提供的方法比较常用的有

setTimeToLive:指定最大的TTL,单位是ms,过期数据会被自动删除。

setInMemory:指定是否放在内存中,对小表有用,可用于提高效率。默认关闭

setBloomFilter:指定是否使用BloomFilter,可提高随机查询效率。默认关闭

setCompressionType:设定数据压缩类型。默认无压缩。

setMaxVersions:指定数据最大保存的版本个数。默认为3。

注意的是,一般我们不去setInMemory为true,默认是关闭的

3)关于入库

官方建议

table.setAutoFlush(false);//数据入库之前先设置此项为false

table.setflushCommits();//入库完成后,手动刷入数据

注意:

在入库过程中,put.setWriteToWAL(true/flase);

关于这一项如果不希望大量数据在存储过程中丢失,建议设置为true,如果仅是在测试演练阶段,为了节省入库时间建议设置为false

4)关于获取表实例

HTablePool pool = new HTablePool(configuration, Integer.MAX_VALUE);

HTable table = (HTable) pool.getTable(tableName);

建议用表连接池的方式获取表,具体池有什么作用,我想用过数据库连接池的同学都知道,我就不再重复

不建议使用new HTable(configuration,tableName);的方式获取表

5)关于查询

建议每个查询语句都放入try catch语句块,并且finally中要进行关闭ResultScanner实例以及将不使用的表重新放入到HTablePool中的操作,具体做法如下

Java代码

  • public static void QueryAll(String tableName) {
  • HTablePool pool = new HTablePool(configuration, Integer.MAX_VALUE);
  • HTable table = null;
  • ResultScanner rs = null;
  • try {
  • Scan scan = new Scan();
  • table = (HTable) pool.getTable(tableName);
  • rs = table.getScanner(scan);
  • for (Result r : rs) {
  • System.out.println("获得到rowkey:" + new String(r.getRow()));
  • for (KeyValue keyValue : r.raw()) {
  • System.out.println("列:" + new String(keyValue.getFamily())
  • + "====值:" + new String(keyValue.getValue()));
  • }
  • }
  • } catch (IOException e) {
  • e.printStackTrace();
  • }finally{
  • rs.close();// 最后还得关闭
  • pool.putTable(table); //实际应用过程中,pool获取实例的方式应该抽取为单例模式的,不应在每个方法都重新获取一次(单例明白?就是抽取到专门获取pool的逻辑类中,具体逻辑为如果pool存在着直接使用,如果不存在则new)
  • }
  • }

public static voidQueryAll(String tableName) {

HTablePool pool = new HTablePool(configuration,Integer.MAX_VALUE);

HTable table = null;

ResultScanner rs = null;

try {

Scan scan = new Scan();

table = (HTable) pool.getTable(tableName);

rs = table.getScanner(scan);

for (Result r : rs) {

System.out.println("获得到rowkey:" + new String(r.getRow()));

for (KeyValue keyValue : r.raw()) {

System.out.println("列:" + newString(keyValue.getFamily())

+ "====值:" + new String(keyValue.getValue()));

}

}

} catch (IOException e) {

e.printStackTrace();

}finally{

rs.close();// 最后还得关闭

pool.putTable(table); //实际应用过程中,pool获取实例的方式应该抽取为单例模式的,不应在每个方法都重新获取一次(单例明白?就是抽取到专门获取pool的逻辑类中,具体逻辑为如果pool存在着直接使用,如果不存在则new)

}

}

更多精彩内容请关注:http://bbs.superwu.cn

关注超人学院微信二维码:

时间: 2024-07-28 16:59:04

hbase性能优化的相关文章

Hbase框架原理及相关的知识点理解、Hbase访问MapReduce、Hbase访问Java API、Hbase shell及Hbase性能优化总结

转自:http://blog.csdn.net/zhongwen7710/article/details/39577431 本blog的内容包含: 第一部分:Hbase框架原理理解 第二部分:Hbase调用MapReduce函数使用理解 第三部分:Hbase调用Java API使用理解 第四部分:Hbase Shell操作 第五部分:Hbase建表.读写操作方式性能优化总结 第一部分:Hbase框架原理理解 概述 HBase是一个构建在HDFS上的分布式列存储系统:HBase是基于Google

HBase性能优化方法总结 (转)

AutoFlush 通过调用HTable.setAutoFlushTo(false)方法可以将HTable写客户端自动flush关闭,这样可以批量写入数据到HBase,而不是有一条put就执行一次更新,只有当put填满客户端写缓存的时候,才会向HBase服务端发起写请求.默认情况下auto flush是开启的. WAL Flag 在HBase中,客户端向集群中的RegionServer提交数据时(Put/Delete操作),首先会写到WAL(Write Ahead Log)日志,即HLog,一个

hbase 性能优化

 1. 表的设计 1.1 Pre-Creating Regions 默认情况下,在创建HBase表的时候会自动创建一个region分区,当导入数据的时候,所有的HBase客户端都向这一个region写数据, 直到这个region足够大了才进行切分.一种可以加快批量写入速度的方法是通过预先创建一些空的regions,这样当数据写入HBase时,会按照 region分区情况,在集群内做数据的负载均衡. 有关预分区,详情参见:Table Creation: Pre-Creating Regions,下

HBase 性能优化笔记

转载:http://www.cnblogs.com/shitouer/archive/2012/08/07/2626377.html#hbase.hregion.max.filesize 1 hbase.hregion.max.filesize应该设置多少合适 2 autoflush=false的影响 3 从性能的角度谈table中family和qualifier的设置 4 hbase.regionserver.handler.count详解 1 hbase.hregion.max.filesi

HBase性能优化 Java Api

1. 使用“连接池” 如果每次和Hbase交互时都去新建连接的话,显然是低效率的,HBase也提供类连接池相关的API. 1.1. HTablePool 早期的API中使用它,但很不幸,现在它已经过时了.在次不再描述. 1.2. HConnection 取代HTablePool的就是现在的HConnection,可以通过它拿到几乎所有关于HBase的相关操作对象. private static HConnection connection = null; private static Confi

HBase性能优化方法总结(一)

一 表的设计 1.1 Pre-Creating Regions 默认情况下,在创建HBase表的时候会自动创建一个region分区,当导入数据的时候,所有的HBase客户端都向这一个region写数据,直到这个region足够大了才进行切分.一种可以加快批量写入速度的方法是通过预先创建一些空的regions,这样当数据写入HBase时,会按照region分区情况,在集群内做数据的负载均衡. 有关预分区,详情参见:Table Creation: Pre-Creating Regions,下面是一个

HBase性能优化方法总结

1. 表的设计 1.1 Pre-Creating Regions 默认情况下,在创建HBase表的时候会自动创建一个region分区,当导入数据的时候,所有的HBase客户端都向这一个region写数据,直到这个region足够大了才进行切分.一种可以加快批量写入速度的方法是通过预先创建一些空的regions,这样当数据写入HBase时,会按照region分区情况,在集群内做数据的负载均衡. 有关预分区,详情参见:Table Creation: Pre-Creating Regions,下面是一

hbase性能优化详解

查询缓存 Scan的caching属性默认值是1,意味着扫描器每次从region服务器抓取1条记录进行匹配.我们可以设置caching为比1大得多的值.例如,设置为500,则一次可以抓取500条,需要注意的是该值设得越大服务器的内存开销会越多. HTableInterface hTable=getHTable(tableName); Scan scan=new Scan(); /*设置缓存*/ scan.setCaching(StaticConfig.getIControl_hbase_cach

hbase性能优化2

1)配置 当你调用create方法时将会加载两个配置文件:hbase-default.xml and hbase-site.xml,利用的是当前的java类路径, 代码中configuration设置的这些配置将会覆盖hbase-default.xml和hbase-site.xml中相同的配置,如果两个配置文件都存在并且都设置好了相应参上面的属性下面的属性即可 2)关于建表 public void createTable(HTableDescriptor desc) HTableDescript