HBase性能优化 Java Api

1. 使用“连接池”

如果每次和Hbase交互时都去新建连接的话,显然是低效率的,HBase也提供类连接池相关的API。

1.1. HTablePool

早期的API中使用它,但很不幸,现在它已经过时了。在次不再描述。

1.2. HConnection

取代HTablePool的就是现在的HConnection,可以通过它拿到几乎所有关于HBase的相关操作对象。

private static HConnection connection = null;
private static Configuration conf =null;

static{
    try {
        conf = HBaseConfiguration.create();
        conf.set("hbase.zookeeper.property.clientPort", "2181");
        conf.set("hbase.zookeeper.quorum", "Hadoop-master01,Hadoop-slave01,Hadoop-slave02");

        connection = HConnectionManager.createConnection(getHBaseConfiguration());
    } catch (ZooKeeperConnectionException e) {
        e.printStackTrace();
    }
}

2. 读 优化

2.1. 根据rowkey

如果本操作中只有一个rowkey的话,大可以使用下边的方式(单个读):

byte[] rowkey = new byte[]{......};
Get get = new Get(rowkey);
Result result = destTable.get(get);

若有多个rowkey的话,可以使用如下方式(批量读):

List<byte[]> rowList = new ArrayList<byte[]>();
List<Get> gets = new ArrayList<Get>();
for(byte[] row:rowList){
  gets.add(new Get(row:));
}
Result[] results = destTable.get(gets);

2.2. 使用Scan

Scan scan = new Scan();
ResultScanner resultScanner = srcTable.getScanner(scan);

可以通过设置hbase.client.scanner.caching参数来设置resultScanner从服务器一次抓取的数据条数。默认是一次一条,这样可以大大的增加结果集游标移动的效率(resultScanner.next())。

设置这个参数的方法有三个:

  • HBase的conf配置文件hdfs-site.xml里可以配置
  • 表的对象:hTable.setScannerCaching(10000);
  • 扫面器对象:scan.setCaching(10000);

另外,还可以通过:

scan.addColumn(Bytes.toBytes("sm"), Bytes.toBytes("ip"));

设置扫描的列,减少不必要的网络流量,提升读表效率。

3. 写 优化

写数据的操作中每条提交一个put,其中包含了rowkey,还有对于的一列或多列值。

3.1. 写入单条数据

byte[] row = Bytes.toBytes(...);
Put put = new Put(row);
put.add(Bytes.toBytes(...), Bytes.toBytes(...), Bytes.toBytes(...));

table.put(put);
table.flushCommits();

其中,table.put(put)是把数据提交到HDFS里,执行了table.flushCommits()之后,将会把数据提交到HBase中。

3.2. 写入多条数据

在写入多条数据时,就会涉及到数据提交和缓存的问题,具体如下:

  • 客户端维护缓存

使用HTable.setAutoFlush(true)设置客户端写入数据时自动维护缓存,当数据达到缓存上限时自动提交数据,这个参数默认是开启的。设置客户端自行维护缓存时,可更具需求来设置缓存的大小,HTable.setWriteBufferSize(writeBufferSize)。

但是在实际开发中,并不提倡这种方法。原因是每次table.put(put)去连接hdfs的时间开销是频繁的,不适合大吞吐量的批量写入。

  • 手动维护缓存

可以把要写入的数据先放入本地内存中,然后使用table.put(List<Put>)来提交数据。这样来减少客户端和集群的交互次数,提高传输的吞吐量。

List<Put> puts = new ArrayList<Put>();
for(int i=0; i<100000; i++){
    byte[] rowkey = Bytes.toBytes(RandomStringUtils.random(8,"ABCDESSSSS"));
    byte[] value = Bytes.toBytes(RandomStringUtils.random(10,"IOJKJHHJNNBGHIKKLM<NH"));
    Put put = new Put(rowkey);
    put.add(Bytes.toBytes(FAMILY_CF), Bytes.toBytes("value"), value);
    puts.add(put);
    if(i%10000==0){
        table.put(puts);
        table.flushCommits();
        puts.clear();
    }
}

3.3. 自增列

destTable.incrementColumnValue(rowkey, Bytes.toBytes(FAMILY_CF), Bytes.toBytes("testIncrement"),Long.parseLong("1") ,true);

往testIncrement列自增1.在批处理系统中,这种使用方法需要慎用,它每次执行都会提交数据,不能实现这一列的批量提交。

时间: 2024-11-07 01:37:19

HBase性能优化 Java Api的相关文章

HBase的常用Java API

1. 创建HBase表的对象 HBase表的对项名字叫HTable,创建它的方法有很多,常见的有如下: org.apache.hadoop.hbase.client.HTable hTable = new HTable(org.apache.hadoop.hbase.HBaseConfiguration conf, String tableName); 或 org.apache.hadoop.hbase.client.HTable hTable = new HTable(org.apache.h

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性能优化方法总结(一)

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

性能优化 java 24 次阅读 &#183; 读完需要 15 分钟 0

摘要: 技术传播的价值,不仅仅体现在通过商业化产品和开源项目来缩短我们构建应用的路径,加速业务的上线速率,也会体现在优秀程序员在工作效率提升.产品性能优化和用户体验改善等小技巧方面的分享,以提高我们的工作能力. 技术传播的价值,不仅仅体现在通过商业化产品和开源项目来缩短我们构建应用的路径,加速业务的上线速率,也会体现在优秀程序员在工作效率提升.产品性能优化和用户体验改善等小技巧方面的分享,以提高我们的工作能力. 从本期开始,我们将邀请来自阿里巴巴各个技术团队的程序员,涵盖中间件.前端.移动开发.

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性能优化方法总结

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

hbase性能优化

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