最近没有管测试环境的,上去看了下,好家伙,kafka羁留了上百万数据,于是打算把数据同步到测试的Hbase库中,在这期间发现了插入性能问题

  1. def putMapData(tableName: String , columnFamily:String, key:String , mapData:Map[String , String]) = {
  2.  
  3. val startTime = System.currentTimeMillis()
  4.  
  5. val table: Table = Init(tableName , columnFamily)
    val endTime = System.currentTimeMillis()
    Logger.getLogger("处理事务").info(s"插入的时间:${(endTime - startTime)}")
    try{
    //TODO rowKeyWithMD5Prefix
  6.  
  7. val rowkey = HbaseTools.rowKeyByMD5(key)
  8.  
  9. val put: Put = new Put(rowkey)
    if(mapData.size > 0){
    for((k , v) <- mapData){
    put.addColumn(Bytes.toBytes(columnFamily) ,Bytes.toBytes(k.toString) , Bytes.toBytes(v.toString))
    }
    }
    table.put(put)
  10.  
  11. }catch{
    case e:Exception => e.printStackTrace()
    }finally {
    table.close()
    }
  12.  
  13. }
  1. /**
  2. * @return 构建表的连接
  3. * */
  4. def Init(tableName: String , columnFamily:String):Table = {
  5. val hTableDescriptor = new HTableDescriptor(TableName.valueOf(tableName))
  6. val hColumnDescriptor = new HColumnDescriptor(columnFamily)
  7. hTableDescriptor.addFamily(hColumnDescriptor)
  8. if(!admin.tableExists(TableName.valueOf(tableName))){
  9. // admin.createTable(hTableDescriptor)
  10. createHTable(conn , tableName , , Array(columnFamily))
  11.  
  12. }
  13. conn.getTable(TableName.valueOf(tableName))
  14. }

发现一条数据过来,会进行一次init,就是判断这个表是不是存在的,如果不存在那么创建表,但是这个过程要50~70ms时间,海量数据下来,处理是非常慢的

也就是说:这块儿代码及其耗费时间

  1. val hTableDescriptor = new HTableDescriptor(TableName.valueOf(tableName))
  2. val hColumnDescriptor = new HColumnDescriptor(columnFamily)
  3. hTableDescriptor.addFamily(hColumnDescriptor)
  4. if(!admin.tableExists(TableName.valueOf(tableName))){
  5. createHTable(conn , tableName , , Array(columnFamily))
  6.  
  7. }

所以,尽量在实时处理时候,不要走这些从程序;

因此,将上面的代码提升带object的成员变量处:

  1. private val config: Configuration = HBaseConfiguration.create()
  2. config.set("hbase.zookeeper.quorum" , GlobalConfigUtils.hbaseQuorem)
  3. config.set("hbase.master" , GlobalConfigUtils.hbaseMaster)
  4. config.set("hbase.zookeeper.property.clientPort" , GlobalConfigUtils.clientPort)
  5. config.set("hbase.rpc.timeout" , GlobalConfigUtils.rpcTimeout)
  6. config.set("hbase.client.operator.timeout" , GlobalConfigUtils.operatorTimeout)
  7. config.set("hbase.client.scanner.timeout.period" , GlobalConfigUtils.scannTimeout)
  8. private val conn: Connection = ConnectionFactory.createConnection(config)
  9. private val admin: Admin = conn.getAdmin
  10. val atomic = new AtomicInteger(0)
  11. var resultAtomic = 0
  12. val hTableDescriptor = new HTableDescriptor(TableName.valueOf(GlobalConfigUtils.tableOrderInfo))
  13. val hColumnDescriptor = new HColumnDescriptor(GlobalConfigUtils.tableColumnFamily)
  14. hTableDescriptor.addFamily(hColumnDescriptor)
  15. if(!admin.tableExists(TableName.valueOf(GlobalConfigUtils.tableOrderInfo))){
  16. createHTable(conn , GlobalConfigUtils.tableOrderInfo , 10 , Array(GlobalConfigUtils.tableColumnFamily))
  17. }private val config: Configuration = HBaseConfiguration.create()
  18. config.set("hbase.zookeeper.quorum" , GlobalConfigUtils.hbaseQuorem)
  19. config.set("hbase.master" , GlobalConfigUtils.hbaseMaster)
  20. config.set("hbase.zookeeper.property.clientPort" , GlobalConfigUtils.clientPort)
  21. config.set("hbase.rpc.timeout" , GlobalConfigUtils.rpcTimeout)
  22. config.set("hbase.client.operator.timeout" , GlobalConfigUtils.operatorTimeout)
  23. config.set("hbase.client.scanner.timeout.period" , GlobalConfigUtils.scannTimeout)
  24. private val conn: Connection = ConnectionFactory.createConnection(config)
  25. private val admin: Admin = conn.getAdmin
  26. val atomic = new AtomicInteger(0)
  27. var resultAtomic = 0
  28. val hTableDescriptor = new HTableDescriptor(TableName.valueOf(GlobalConfigUtils.tableOrderInfo))
  29. val hColumnDescriptor = new HColumnDescriptor(GlobalConfigUtils.tableColumnFamily)
  30. hTableDescriptor.addFamily(hColumnDescriptor)
  31. if(!admin.tableExists(TableName.valueOf(GlobalConfigUtils.tableOrderInfo))){
  32. createHTable(conn , GlobalConfigUtils.tableOrderInfo , 10 , Array(GlobalConfigUtils.tableColumnFamily))
  33. }

然后我在提交代码。发现:

以前的2000条数据插入时间大概需要140000ms的时间

现在处理的时间:

速度提升了大概140000 /10 倍

实时同步到Hbase的优化-1的更多相关文章

  1. Mysql 到 Hbase 数据如何实时同步,强大的 Streamsets 告诉你

    很多情况大数据集群需要获取业务数据,用于分析.通常有两种方式: 业务直接或间接写入的方式 业务的关系型数据库同步到大数据集群的方式 第一种可以是在业务中编写代码,将觉得需要发送的数据发送到消息队列,最 ...

  2. Mysql数据实时同步

    企业运维的数据库最常见的是 mysql;但是 mysql 有个缺陷:当数据量达到千万条的时候,mysql 的相关操作会变的非常迟缓; 如果这个时候有需求需要实时展示数据;对于 mysql 来说是一种灾 ...

  3. HBase性能优化方法总结(转)

    本文主要是从HBase应用程序设计与开发的角度,总结几种常用的性能优化方法.有关HBase系统配置级别的优化,这里涉及的不多,这部分可以参考:淘宝Ken Wu同学的博客. 1. 表的设计 1.1 Pr ...

  4. HBase性能优化方法总结(转)

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

  5. Hbase性能优化

    HBase性能优化方法总结 1. 表的设计 1.1 Pre-Creating Regions 默认情况下,在创建HBase表的时候会自动创建一个region分区,当导入数据的时候,所有的HBase客户 ...

  6. 基于Canal和Kafka实现MySQL的Binlog近实时同步

    前提 近段时间,业务系统架构基本完备,数据层面的建设比较薄弱,因为笔者目前工作重心在于搭建一个小型的数据平台.优先级比较高的一个任务就是需要近实时同步业务系统的数据(包括保存.更新或者软删除)到一个另 ...

  7. hbase读写优化

    一.hbase读优化 客户端优化 1.scan缓存是否设置合理? 优化原理:一次scan请求,实际并不会一次就将所有数据加载到本地,而是多次RPC请求进行加载.默认100条数据大小. 优化建议:大sc ...

  8. inotify+rsync实现实时同步部署

    1.1.架构规划 1.1.1架构规划准备 服务器系统 角色 IP Centos6.7 x86_64 NFS服务器端(NFS-server-inotify-tools) 192.168.1.14 Cen ...

  9. lsyncd 实时同步

    1. 几大实时同步工具比较 1.1 inotify + rsync 最近一直在寻求生产服务服务器上的同步替代方案,原先使用的是inotify + rsync,但随着文件数量的增大到100W+,目录下的 ...

随机推荐

  1. [面试]synchronized

    synchronized 把面试中遇到的问题进行了整理. 本篇文章copy+整理自: 1. http://www.cnblogs.com/lingepeiyong/archive/2012/10/30 ...

  2. 远程代理模式-Remote Proxy(Java实现)

    远程代理模式-Remote Proxy 服务端通过rmi将对象注册到远程服务, 客户端使用时, 只需要通过rmi协议获取即可, 只要接口统一, 即可不需要知道内部具体实现, 直接调用使用. Compa ...

  3. docker 容器网络基础

    ======================== docker缺省自带的网络 ======================== host 网络, This enables a container to ...

  4. django --视图装饰器

  5. TP5框架,开源小程序商城源码,前端+后台完整版

    CRMEB微信公众号商城小程序商城数据同步,带积分.优惠券.秒杀.砍价.分销等功能,更是一套方便二次开发的框架 开源地址:https://github.crmeb.net/u/crmeb 商城演示后台 ...

  6. SW:HTML DOM

    1:节点:nodeType,nodeValue,nodeName getAttributeNode() 方法从当前元素中通过名称获取属性节点. 元素节点nodeValue是null,属性节点nodeV ...

  7. awk和sed截取nginx和tomcat时间段日志

    1 nginx日志截取示例 日志路径:/usr/local/nginx/logs, 截取access.log中2019年3月24日17点00~02之间的日志: 写法1: cat access.log ...

  8. c++ 常用头文件

    1.#include<iostream> iostream 的意思是输入输出流.#include<iostream>是标准的C++头文件,任何符合标准的C++开发环境都有这个头 ...

  9. 资产信息之收集资产代码流程,API的一个认证,数据库表的设计

    收集资产代码流程 1.起初我们些的代码是面条式的一堆的逻辑判断.   后来通过了不断的优化升级实现了一个3种方案都支持的CMDB系统,我们用哪种方案只需要在配置文件里修改一下设置就行了.   同时我们 ...

  10. 自动备份远程mongodb数据库并拉取到本地

    自动备份远程mongodb数据库并拉取到本地 目标: 远程服务器 .1中的mongodb数据拉回公司测试服务器中 .远程服务器中编写自动备份mongodb脚本 ①编写脚本 # vim /opt/bac ...