• 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邮件列表 user@hbase.apache.or咨询了一下,《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

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

  • 相关阅读:
    【必备】史上最全的浏览器 CSS & JS Hack 手册(转)
    iScroll4.2.5中的无法滑动或点击的解决方案(转)
    无障碍网页设计(WCAG2.0)
    大小端
    TCP报文结构
    A*
    shell中uniq与sort -u 两种去重的对别
    login流程
    类模板成员函数
    game 角色相关记录
  • 原文地址:https://www.cnblogs.com/shenguanpu/p/2578163.html
Copyright © 2020-2023  润新知