Hbase复杂操作的优化- Htable HtablePool

Htable主要提供表内的操作,put,delete,get,scan等操作

HTablePool 可以建立池,存储HTableInterface接口的实现对象,一般是Htable,避免创建Htable的消耗。

HTablePool 默认创建方式:

new HTablePool(conf, poolSize);

使用这种方式得到的Htable,无法设置autoflush,在速度要求高可以容忍数据丢失场景中,会降低3/4左右的速度。

查看HTablePool创建方法发现,HTable由其内部参数HTableFactory创建,没有做任何设置

因此新建类 HTableBufferFactory implements HTableInterfaceFactory

增加设置:

HTable table = new HTable(config, tableName);
table.setAutoFlush(false);

即可关闭自动提交

put对象时,设置 put.setWriteToWAL(false);  也可提高部分性能(至今没看到这个log写到哪儿去了。。。)

 

但是实际业务场景中,并不是只有put这么简单,后台处理机的功能是录入数据,包含了put delete incr 三种操作,并且要求高速处理

关闭autoflush有可能导致数据不一致情况(待测试),并且无法避免delete incr操作的rpc调用请求,这时需要结合 HTable.batch 实现批处理操作

创建 List<Row> batch = new ArrayList<Row>();  达到一定限度时batch处理

 

需要注意的是hbase的版本,在0.92版本不支持incr的批量,原本不知道这个情况

在hbase user邮件列表 [email protected]咨询了一下,《hbase权威指南》作者Lars George两小时内就回复了我,大爱邮件列表啊!

在他写书时候还没支持 0.94已经支持,但没有在change log里,算是个小功能吧 jira地址 https://issues.apache.org/jira/browse/HBASE-2947

incr进行batch,并把线程数double之后,处理2000条数据能力对比:

batch和线程double之前:

07 05 16:15:05 [[ClickDBWorker]34] INFO c.t.t.m.MsgReactor - [MsgReactor] exploadeAll to hbase cost time:1.045479
07 05 16:15:05 [[ClickDBWorker]34] INFO c.t.t.m.MsgReactor - [MsgReactor] exploadeAll to mysql cost time:0.014752
07 05 16:15:08 [[ClickDBWorker]34] INFO c.t.t.m.MsgReactor - [MsgReactor] exploadeAll to hbase cost time:2.638535
07 05 16:15:08 [[ClickDBWorker]34] INFO c.t.t.m.MsgReactor - [MsgReactor] exploadeAll to mysql cost time:0.217352
07 05 16:15:09 [[ClickDBWorker]41] INFO c.t.t.m.MsgReactor - [MsgReactor] exploadeAll to hbase cost time:64.197514
07 05 16:15:10 [[ClickDBWorker]35] INFO c.t.t.m.MsgReactor - [MsgReactor] exploadeAll to mysql cost time:2.379507
07 05 16:15:14 [[ClickDBWorker]32] INFO c.t.t.m.MsgReactor - [MsgReactor] exploadeAll to mysql cost time:1.904393
07 05 16:15:15 [[ClickDBWorker]30] INFO c.t.t.m.MsgReactor - [MsgReactor] exploadeAll to hbase cost time:71.706639
07 05 16:15:21 [[ClickDBWorker]40] INFO c.t.t.m.MsgReactor - [MsgReactor] exploadeAll to mysql cost time:1.533836

batch和线程double之后

07 06 16:33:39 [[ClickDBWorker]18] INFO c.t.t.m.MsgReactor - [MsgReactor] exploadeAll to mysql cost time:1.127692
07 06 16:33:40 [[ClickDBWorker]18] INFO c.t.t.m.MsgReactor - [MsgReactor] exploadeAll to hbase cost time:0.800586
07 06 16:33:43 [[ClickDBWorker]34] INFO c.t.t.m.MsgReactor - [MsgReactor] exploadeAll to mysql cost time:0.532394
07 06 16:33:43 [[ClickDBWorker]34] INFO c.t.t.m.MsgReactor - [MsgReactor] exploadeAll to hbase cost time:1.79E-4

 

之前出现写十几个小时,可用的分配内存全部占满问题,应该就是线程处理太慢,创建的对象无法释放造成的。

 

 

你可能感兴趣的:(hbase)