热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

HBase性能优化方法总结(3):写表操作

本文主要是从HBase应用程序设计与开发的角度,总结几种常用的性能优化方法。有关HBase系统配置级别的优化,可参考:淘宝KenWu同学的

本文主要是从HBase应用程序设计与开发的角度,总结几种常用的性能优化方法。有关HBase系统配置级别的优化,可参考:淘宝Ken Wu同学的博客。

下面是本文总结的第二部分内容:写表操作相关的优化方法。


2. 写表操作


2.1 多HTable并发写

创建多个HTable客户端用于写操作,提高写数据的吞吐量,一个例子:


[java] view plaincopy
  1. static final Configuration conf = HBaseConfiguration.create();  
  2. static final String table_log_name = “user_log”;  
  3. wTableLog = new HTable[tableN];  
  4. for (int i &#61; 0; i < tableN; i&#43;&#43;) {  
  5.     wTableLog[i] &#61; new HTable(conf, table_log_name);  
  6.     wTableLog[i].setWriteBufferSize(5 * 1024 * 1024); //5MB  
  7.     wTableLog[i].setAutoFlush(false);  
  8. }  




2.2 HTable参数设置


2.2.1 Auto Flush

通过调用HTable.setAutoFlush(false)方法可以将HTable写客户端的自动flush关闭&#xff0c;这样可以批量写入数据到HBase&#xff0c;而不是有一条put就执行一次更新&#xff0c;只有当put填满客户端写缓存时&#xff0c;才实际向HBase服务端发起写请求。默认情况下auto flush是开启的。


2.2.2 Write Buffer

通过调用HTable.setWriteBufferSize(writeBufferSize)方法可以设置HTable客户端的写buffer大小&#xff0c;如果新设置的buffer小于当前写buffer中的数据时&#xff0c;buffer将会被flush到服务端。其中&#xff0c;writeBufferSize的单位是byte字节数&#xff0c;可以根据实际写入数据量的多少来设置该值。


2.2.3 WAL Flag

在HBae中&#xff0c;客户端向集群中的RegionServer提交数据时&#xff08;Put/Delete操作&#xff09;&#xff0c;首先会先写WAL&#xff08;Write Ahead Log&#xff09;日志&#xff08;即HLog&#xff0c;一个RegionServer上的所有Region共享一个HLog&#xff09;&#xff0c;只有当WAL日志写成功后&#xff0c;再接着写MemStore&#xff0c;然后客户端被通知提交数据成功&#xff1b;如果写WAL日志失败&#xff0c;客户端则被通知提交失败。这样做的好处是可以做到RegionServer宕机后的数据恢复。

因此&#xff0c;对于相对不太重要的数据&#xff0c;可以在Put/Delete操作时&#xff0c;通过调用Put.setWriteToWAL(false)或Delete.setWriteToWAL(false)函数&#xff0c;放弃写WAL日志&#xff0c;从而提高数据写入的性能。

值得注意的是&#xff1a;谨慎选择关闭WAL日志&#xff0c;因为这样的话&#xff0c;一旦RegionServer宕机&#xff0c;Put/Delete的数据将会无法根据WAL日志进行恢复。


2.3 批量写

通过调用HTable.put(Put)方法可以将一个指定的row key记录写入HBase&#xff0c;同样HBase提供了另一个方法&#xff1a;通过调用HTable.put(List)方法可以将指定的row key列表&#xff0c;批量写入多行记录&#xff0c;这样做的好处是批量执行&#xff0c;只需要一次网络I/O开销&#xff0c;这对于对数据实时性要求高&#xff0c;网络传输RTT高的情景下可能带来明显的性能提升。


2.4 多线程并发写

在客户端开启多个HTable写线程&#xff0c;每个写线程负责一个HTable对象的flush操作&#xff0c;这样结合定时flush和写buffer&#xff08;writeBufferSize&#xff09;&#xff0c;可以既保证在数据量小的时候&#xff0c;数据可以在较短时间内被flush&#xff08;如1秒内&#xff09;&#xff0c;同时又保证在数据量大的时候&#xff0c;写buffer一满就及时进行flush。下面给个具体的例子&#xff1a;


[java] view plaincopy
  1. for (int i &#61; 0; i < threadN; i&#43;&#43;) {  
  2.     Thread th &#61; new Thread() {  
  3.         public void run() {  
  4.             while (true) {  
  5.                 try {  
  6.                     sleep(1000); //1 second  
  7.                 } catch (InterruptedException e) {  
  8.                     e.printStackTrace();  
  9.                 }  
  10. synchronized (wTableLog[i]) {  
  11.                     try {  
  12.                         wTableLog[i].flushCommits();  
  13.                     } catch (IOException e) {  
  14.                         e.printStackTrace();  
  15.                     }  
  16.                 }  
  17.             }  
  18. }  
  19.     };  
  20.     th.setDaemon(true);  
  21.     th.start();  
  22. }  



转载自&#xff1a;http://www.cnblogs.com/panfeng412/archive/2012/03/08/hbase-performance-tuning-section2.html
  1. static final Configuration conf &#61; HBaseConfiguration.create(); 
  2. static final String table_log_name &#61; “user_log”; 
  3. wTableLog &#61; new HTable[tableN]; 
  4. for (int i &#61; 0; i
  5.     wTableLog[i] &#61; new HTable(conf, table_log_name); 
  6.     wTableLog[i].setWriteBufferSize(5 * 1024 * 1024); //5MB 
  7.     wTableLog[i].setAutoFlush(false); 



2.2 HTable参数设置


2.2.1 Auto Flush

通过调用HTable.setAutoFlush(false)方法可以将HTable写客户端的自动flush关闭&#xff0c;这样可以批量写入数据到HBase&#xff0c;而不是有一条put就执行一次更新&#xff0c;只有当put填满客户端写缓存时&#xff0c;才实际向HBase服务端发起写请求。默认情况下auto flush是开启的。


2.2.2 Write Buffer

通过调用HTable.setWriteBufferSize(writeBufferSize)方法可以设置HTable客户端的写buffer大小&#xff0c;如果新设置的buffer小于当前写buffer中的数据时&#xff0c;buffer将会被flush到服务端。其中&#xff0c;writeBufferSize的单位是byte字节数&#xff0c;可以根据实际写入数据量的多少来设置该值。


2.2.3 WAL Flag

在HBae中&#xff0c;客户端向集群中的RegionServer提交数据时&#xff08;Put/Delete操作&#xff09;&#xff0c;首先会先写WAL&#xff08;Write Ahead Log&#xff09;日志&#xff08;即HLog&#xff0c;一个RegionServer上的所有Region共享一个HLog&#xff09;&#xff0c;只有当WAL日志写成功后&#xff0c;再接着写MemStore&#xff0c;然后客户端被通知提交数据成功&#xff1b;如果写WAL日志失败&#xff0c;客户端则被通知提交失败。这样做的好处是可以做到RegionServer宕机后的数据恢复。

因此&#xff0c;对于相对不太重要的数据&#xff0c;可以在Put/Delete操作时&#xff0c;通过调用Put.setWriteToWAL(false)或Delete.setWriteToWAL(false)函数&#xff0c;放弃写WAL日志&#xff0c;从而提高数据写入的性能。

值得注意的是&#xff1a;谨慎选择关闭WAL日志&#xff0c;因为这样的话&#xff0c;一旦RegionServer宕机&#xff0c;Put/Delete的数据将会无法根据WAL日志进行恢复。


2.3 批量写

通过调用HTable.put(Put)方法可以将一个指定的row key记录写入HBase&#xff0c;同样HBase提供了另一个方法&#xff1a;通过调用HTable.put(List)方法可以将指定的row key列表&#xff0c;批量写入多行记录&#xff0c;这样做的好处是批量执行&#xff0c;只需要一次网络I/O开销&#xff0c;这对于对数据实时性要求高&#xff0c;网络传输RTT高的情景下可能带来明显的性能提升。


2.4 多线程并发写

在客户端开启多个HTable写线程&#xff0c;每个写线程负责一个HTable对象的flush操作&#xff0c;这样结合定时flush和写buffer&#xff08;writeBufferSize&#xff09;&#xff0c;可以既保证在数据量小的时候&#xff0c;数据可以在较短时间内被flush&#xff08;如1秒内&#xff09;&#xff0c;同时又保证在数据量大的时候&#xff0c;写buffer一满就及时进行flush。下面给个具体的例子&#xff1a;


[java] view plaincopy
  1. for (int i &#61; 0; i
  2.     Thread th &#61; new Thread() { 
  3.         public void run() { 
  4.             while (true) { 
  5.                 try
  6.                     sleep(1000); //1 second 
  7.                 } catch (InterruptedException e) { 
  8.                     e.printStackTrace(); 
  9.                 } 
  10. synchronized (wTableLog[i]) { 
  11.                     try
  12.                         wTableLog[i].flushCommits(); 
  13.                     } catch (IOException e) { 
  14.                         e.printStackTrace(); 
  15.                     } 
  16.                 } 
  17.             } 
  18.     }; 
  19.     th.setDaemon(true); 
  20.     th.start(); 



转载自&#xff1a;http://www.cnblogs.com/panfeng412/archive/2012/03/08/hbase-performance-tuning-section2.html  
推荐阅读
author-avatar
曼珠沙華的朦朧_759
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有