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邮件列表 user@hbase.apache.org 咨询了一下,《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
之前出现写十几个小时,可用的分配内存全部占满问题,应该就是线程处理太慢,创建的对象无法释放造成的。