本文主要是从HBase应用程序设计与开发的角度,总结几种经常使用的性能优化方法。有关HBase系统配置级别的优化,可参考:淘宝Ken Wu同窗的博客。缓存
下面是本文总结的第二部份内容:写表操做相关的优化方法。性能优化
建立多个HTable客户端用于写操做,提升写数据的吞吐量,一个例子:网络
Configuration conf = HBaseConfiguration.create(); String table_log_name = “user_log”; wTableLog = HTable[tableN]; ( i = 0; i < tableN; i++) { wTableLog[i] = HTable(conf, table_log_name); wTableLog[i].setWriteBufferSize(5 * 1024 * 1024); wTableLog[i].setAutoFlush(); }
经过调用HTable.setAutoFlush(false)方法能够将HTable写客户端的自动flush关闭,这样能够批量写入数据到 HBase,而不是有一条put就执行一次更新,只有当put填满客户端写缓存时,才实际向HBase服务端发起写请求。默认状况下auto flush是开启的。多线程
经过调用HTable.setWriteBufferSize(writeBufferSize)方法能够设置 HTable客户端的写buffer大小,若是新设置的buffer小于当前写buffer中的数据时,buffer将会被flush到服务端。其 中,writeBufferSize的单位是byte字节数,能够根据实际写入数据量的多少来设置该值。并发
在HBae中,客户端向集群中的RegionServer提交数据时(Put/Delete操做),首先会先写WAL(Write Ahead Log)日志(即HLog,一个RegionServer上的全部Region共享一个HLog),只有当WAL日志写成功后,再接着写 MemStore,而后客户端被通知提交数据成功;若是写WAL日志失败,客户端则被通知提交失败。这样作的好处是能够作到RegionServer宕机 后的数据恢复。函数
所以,对于相对不过重要的数据,能够在Put/Delete操做时,经过调用Put.setWriteToWAL(false)或Delete.setWriteToWAL(false)函数,放弃写WAL日志,从而提升数据写入的性能。性能
值得注意的是:谨慎选择关闭WAL日志,由于这样的话,一旦RegionServer宕机,Put/Delete的数据将会没法根据WAL日志进行恢复。优化
经过调用HTable.put(Put)方法能够将一个指定的row key记录写入HBase,一样HBase提供了另外一个方法:经过调用HTable.put(List<Put>)方法能够将指定的row key列表,批量写入多行记录,这样作的好处是批量执行,只须要一次网络I/O开销,这对于对数据实时性要求高,网络传输RTT高的情景下可能带来明显的 性能提高。spa
在客户端开启多个HTable写线程,每一个写线程负责一个HTable对象的flush操做,这样结合定时flush和写 buffer(writeBufferSize),能够既保证在数据量小的时候,数据能够在较短期内被flush(如1秒内),同时又保证在数据量大的 时候,写buffer一满就及时进行flush。下面给个具体的例子:线程
( i = 0; i < threadN; i++) { Thread th = Thread() { run() { () { { sleep(1000); } (InterruptedException e) { e.printStackTrace(); } (wTableLog[i]) { { wTableLog[i].flushCommits(); } (IOException e) { e.printStackTrace(); } } } } }; th.setDaemon(); th.start(); }