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", "");
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=; i<; i++){
byte[] rowkey = Bytes.toBytes(RandomStringUtils.random(,"ABCDESSSSS"));
byte[] value = Bytes.toBytes(RandomStringUtils.random(,"IOJKJHHJNNBGHIKKLM<NH"));
Put put = new Put(rowkey);
put.add(Bytes.toBytes(FAMILY_CF), Bytes.toBytes("value"), value);
puts.add(put);
if(i%==){
table.put(puts);
table.flushCommits();
puts.clear();
}
}
3.3. 自增列
destTable.incrementColumnValue(rowkey, Bytes.toBytes(FAMILY_CF), Bytes.toBytes("testIncrement"),Long.parseLong("") ,true);
往testIncrement列自增1.在批处理系统中,这种使用方法需要慎用,它每次执行都会提交数据,不能实现这一列的批量提交。
HBase性能优化 Java Api的更多相关文章
- hbase性能优化总结
hbase性能优化总结 1. 表的设计 1.1 Pre-Creating Regions 默认情况下,在创建HBase表的时候会自动创建一个region分区,当导入数据的时候,所有的HBase客户端都 ...
- Hadoop生态圈-HBase性能优化
Hadoop生态圈-HBase性能优化 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.
- HBase性能优化方法总结(转)
原文链接:HBase性能优化方法总结(一):表的设计 本文主要是从HBase应用程序设计与开发的角度,总结几种常用的性能优化方法.有关HBase系统配置级别的优化,可参考:淘宝Ken Wu同学的博客. ...
- Hbase性能优化
HBase性能优化方法总结 1. 表的设计 1.1 Pre-Creating Regions 默认情况下,在创建HBase表的时候会自动创建一个region分区,当导入数据的时候,所有的HBase客户 ...
- Hbase框架原理及相关的知识点理解、Hbase访问MapReduce、Hbase访问Java API、Hbase shell及Hbase性能优化总结
转自:http://blog.csdn.net/zhongwen7710/article/details/39577431 本blog的内容包含: 第一部分:Hbase框架原理理解 第二部分:Hbas ...
- HBase性能优化完全版
近期在处理HBase的业务方面常常遇到各种瓶颈,一天大概一亿条数据,在HBase性能调优方面进行相关配置和调优后取得了一定的成效,于是,特此在这里总结了一下关于HBase全面的配置,主要参考我的另外两 ...
- HBase性能优化方法总结(转)
本文主要是从HBase应用程序设计与开发的角度,总结几种常用的性能优化方法.有关HBase系统配置级别的优化,这里涉及的不多,这部分可以参考:淘宝Ken Wu同学的博客. 1. 表的设计 1.1 Pr ...
- HBase性能优化方法总结(一):表的设计
本文主要是从HBase应用程序设计与开发的角度,总结几种常用的性能优化方法.有关HBase系统配置级别的优化,可参考:淘宝Ken Wu同学的博客. 下面是本文总结的第一部分内容:表的设计相关的优化方法 ...
- HBase性能优化方法总结(二):写表操作
转自:http://www.cnblogs.com/panfeng412/archive/2012/03/08/hbase-performance-tuning-section2.html 本文主要是 ...
随机推荐
- 微信小程序: 编译.wxss文件错误解决
博主最近又重新开始捡起微信小程序,想做点自己的东西.了解到最近小程序工具有做更新,就顺手更新了最新的版本,功能比之前强大了不少! 更新归更新,更新后控制台就一直报下面这个错误: 解决办法 有问题总 ...
- Myeclipse默认编码设置
Myeclipse默认编码设置 由于编码问题的出现,我们就必须明确自己在Myeclipse所写的各种文件是按照什么格式来进行编码的.所以只有知己知彼,才能bug少出. 对于刚接触MyEclipse的不 ...
- mysql网页客户端工具
mysql数据库的远程管理,云服务器数据库的管理监控等都可以使用 TreeSoft, TreeSoft数据库管理系统使用JAVA开发,采用稳定通用的springMVC +JDBC架构,实现基于WEB ...
- python之线程queue
线程queue介绍 Queue的种类: FIFO: Queue.Queue(maxsize=0) FIFO即First in First Out,先进先出.Queue提供了一个基本的FIFO容器,使 ...
- Ubuntu加入opencv库的环境变量
1.用gedit打开/etc/ld.so.conf 终端输入: sudo gedit /etc/ld.so.conf 文件末行加入:include /usr/loacal/lib .然后终端执行指令: ...
- redis 事务、Jedis事务处理流程
127.0.0.1:6379> multiOK127.0.0.1:6379> sadd myset a b cQUEUED ——>并没有执行,排队等待127.0.0.1:6379& ...
- 3org.springframework.beans.factory.BeanDefinitionStoreException异常
1.下面是我遇到的异常信息: 2017-03-25 18:01:11,322 [localhost-startStop-1][org.springframework.web.context.Conte ...
- Django基本设置
Dango设置流程图片示例: 设置路由时需要注意的一个点是:Django中定义路由时,通常习惯以斜线 / 结尾 其他常用命令: python manage.py runserver 0.0.0.0:8 ...
- JS DOM节点增删改查 属性设置
一.节点操作 增 createElement(name)创建元素 appendChild();将元素添加 删 获得要删除的元素 获得它的父元素 使用removeChild()方法删除 改 第一种方 ...
- 使用dva脚手架(dva-cli)快速构建React项目
安装 dva-cli 你应该会更希望关注逻辑本身,而不是手动敲入一行行代码来构建初始的项目结构,以及配置开发环境. 那么,首先需要安装的是 dva-cli .dva-cli 是 dva 的命令行工具, ...