实时同步到Hbase的优化-1
最近没有管测试环境的,上去看了下,好家伙,kafka羁留了上百万数据,于是打算把数据同步到测试的Hbase库中,在这期间发现了插入性能问题
- def putMapData(tableName: String , columnFamily:String, key:String , mapData:Map[String , String]) = {
- val startTime = System.currentTimeMillis()
- val table: Table = Init(tableName , columnFamily)
val endTime = System.currentTimeMillis()
Logger.getLogger("处理事务").info(s"插入的时间:${(endTime - startTime)}")
try{
//TODO rowKeyWithMD5Prefix- val rowkey = HbaseTools.rowKeyByMD5(key)
- 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)- }catch{
case e:Exception => e.printStackTrace()
}finally {
table.close()
}- }
- /**
- * @return 构建表的连接
- * */
- def Init(tableName: String , columnFamily:String):Table = {
- val hTableDescriptor = new HTableDescriptor(TableName.valueOf(tableName))
- val hColumnDescriptor = new HColumnDescriptor(columnFamily)
- hTableDescriptor.addFamily(hColumnDescriptor)
- if(!admin.tableExists(TableName.valueOf(tableName))){
- // admin.createTable(hTableDescriptor)
- createHTable(conn , tableName , , Array(columnFamily))
- }
- conn.getTable(TableName.valueOf(tableName))
- }
发现一条数据过来,会进行一次init,就是判断这个表是不是存在的,如果不存在那么创建表,但是这个过程要50~70ms时间,海量数据下来,处理是非常慢的
也就是说:这块儿代码及其耗费时间
- val hTableDescriptor = new HTableDescriptor(TableName.valueOf(tableName))
- val hColumnDescriptor = new HColumnDescriptor(columnFamily)
- hTableDescriptor.addFamily(hColumnDescriptor)
- if(!admin.tableExists(TableName.valueOf(tableName))){
- createHTable(conn , tableName , , Array(columnFamily))
- }
所以,尽量在实时处理时候,不要走这些从程序;
因此,将上面的代码提升带object的成员变量处:
- private val config: Configuration = HBaseConfiguration.create()
- config.set("hbase.zookeeper.quorum" , GlobalConfigUtils.hbaseQuorem)
- config.set("hbase.master" , GlobalConfigUtils.hbaseMaster)
- config.set("hbase.zookeeper.property.clientPort" , GlobalConfigUtils.clientPort)
- config.set("hbase.rpc.timeout" , GlobalConfigUtils.rpcTimeout)
- config.set("hbase.client.operator.timeout" , GlobalConfigUtils.operatorTimeout)
- config.set("hbase.client.scanner.timeout.period" , GlobalConfigUtils.scannTimeout)
- private val conn: Connection = ConnectionFactory.createConnection(config)
- private val admin: Admin = conn.getAdmin
- val atomic = new AtomicInteger(0)
- var resultAtomic = 0
- val hTableDescriptor = new HTableDescriptor(TableName.valueOf(GlobalConfigUtils.tableOrderInfo))
- val hColumnDescriptor = new HColumnDescriptor(GlobalConfigUtils.tableColumnFamily)
- hTableDescriptor.addFamily(hColumnDescriptor)
- if(!admin.tableExists(TableName.valueOf(GlobalConfigUtils.tableOrderInfo))){
- createHTable(conn , GlobalConfigUtils.tableOrderInfo , 10 , Array(GlobalConfigUtils.tableColumnFamily))
- }private val config: Configuration = HBaseConfiguration.create()
- config.set("hbase.zookeeper.quorum" , GlobalConfigUtils.hbaseQuorem)
- config.set("hbase.master" , GlobalConfigUtils.hbaseMaster)
- config.set("hbase.zookeeper.property.clientPort" , GlobalConfigUtils.clientPort)
- config.set("hbase.rpc.timeout" , GlobalConfigUtils.rpcTimeout)
- config.set("hbase.client.operator.timeout" , GlobalConfigUtils.operatorTimeout)
- config.set("hbase.client.scanner.timeout.period" , GlobalConfigUtils.scannTimeout)
- private val conn: Connection = ConnectionFactory.createConnection(config)
- private val admin: Admin = conn.getAdmin
- val atomic = new AtomicInteger(0)
- var resultAtomic = 0
- val hTableDescriptor = new HTableDescriptor(TableName.valueOf(GlobalConfigUtils.tableOrderInfo))
- val hColumnDescriptor = new HColumnDescriptor(GlobalConfigUtils.tableColumnFamily)
- hTableDescriptor.addFamily(hColumnDescriptor)
- if(!admin.tableExists(TableName.valueOf(GlobalConfigUtils.tableOrderInfo))){
- createHTable(conn , GlobalConfigUtils.tableOrderInfo , 10 , Array(GlobalConfigUtils.tableColumnFamily))
- }
然后我在提交代码。发现:
以前的2000条数据插入时间大概需要140000ms的时间
现在处理的时间:
速度提升了大概140000 /10 倍
实时同步到Hbase的优化-1的更多相关文章
- Mysql 到 Hbase 数据如何实时同步,强大的 Streamsets 告诉你
很多情况大数据集群需要获取业务数据,用于分析.通常有两种方式: 业务直接或间接写入的方式 业务的关系型数据库同步到大数据集群的方式 第一种可以是在业务中编写代码,将觉得需要发送的数据发送到消息队列,最 ...
- Mysql数据实时同步
企业运维的数据库最常见的是 mysql;但是 mysql 有个缺陷:当数据量达到千万条的时候,mysql 的相关操作会变的非常迟缓; 如果这个时候有需求需要实时展示数据;对于 mysql 来说是一种灾 ...
- HBase性能优化方法总结(转)
本文主要是从HBase应用程序设计与开发的角度,总结几种常用的性能优化方法.有关HBase系统配置级别的优化,这里涉及的不多,这部分可以参考:淘宝Ken Wu同学的博客. 1. 表的设计 1.1 Pr ...
- HBase性能优化方法总结(转)
原文链接:HBase性能优化方法总结(一):表的设计 本文主要是从HBase应用程序设计与开发的角度,总结几种常用的性能优化方法.有关HBase系统配置级别的优化,可参考:淘宝Ken Wu同学的博客. ...
- Hbase性能优化
HBase性能优化方法总结 1. 表的设计 1.1 Pre-Creating Regions 默认情况下,在创建HBase表的时候会自动创建一个region分区,当导入数据的时候,所有的HBase客户 ...
- 基于Canal和Kafka实现MySQL的Binlog近实时同步
前提 近段时间,业务系统架构基本完备,数据层面的建设比较薄弱,因为笔者目前工作重心在于搭建一个小型的数据平台.优先级比较高的一个任务就是需要近实时同步业务系统的数据(包括保存.更新或者软删除)到一个另 ...
- hbase读写优化
一.hbase读优化 客户端优化 1.scan缓存是否设置合理? 优化原理:一次scan请求,实际并不会一次就将所有数据加载到本地,而是多次RPC请求进行加载.默认100条数据大小. 优化建议:大sc ...
- inotify+rsync实现实时同步部署
1.1.架构规划 1.1.1架构规划准备 服务器系统 角色 IP Centos6.7 x86_64 NFS服务器端(NFS-server-inotify-tools) 192.168.1.14 Cen ...
- lsyncd 实时同步
1. 几大实时同步工具比较 1.1 inotify + rsync 最近一直在寻求生产服务服务器上的同步替代方案,原先使用的是inotify + rsync,但随着文件数量的增大到100W+,目录下的 ...
随机推荐
- [面试]synchronized
synchronized 把面试中遇到的问题进行了整理. 本篇文章copy+整理自: 1. http://www.cnblogs.com/lingepeiyong/archive/2012/10/30 ...
- 远程代理模式-Remote Proxy(Java实现)
远程代理模式-Remote Proxy 服务端通过rmi将对象注册到远程服务, 客户端使用时, 只需要通过rmi协议获取即可, 只要接口统一, 即可不需要知道内部具体实现, 直接调用使用. Compa ...
- docker 容器网络基础
======================== docker缺省自带的网络 ======================== host 网络, This enables a container to ...
- django --视图装饰器
- TP5框架,开源小程序商城源码,前端+后台完整版
CRMEB微信公众号商城小程序商城数据同步,带积分.优惠券.秒杀.砍价.分销等功能,更是一套方便二次开发的框架 开源地址:https://github.crmeb.net/u/crmeb 商城演示后台 ...
- SW:HTML DOM
1:节点:nodeType,nodeValue,nodeName getAttributeNode() 方法从当前元素中通过名称获取属性节点. 元素节点nodeValue是null,属性节点nodeV ...
- awk和sed截取nginx和tomcat时间段日志
1 nginx日志截取示例 日志路径:/usr/local/nginx/logs, 截取access.log中2019年3月24日17点00~02之间的日志: 写法1: cat access.log ...
- c++ 常用头文件
1.#include<iostream> iostream 的意思是输入输出流.#include<iostream>是标准的C++头文件,任何符合标准的C++开发环境都有这个头 ...
- 资产信息之收集资产代码流程,API的一个认证,数据库表的设计
收集资产代码流程 1.起初我们些的代码是面条式的一堆的逻辑判断. 后来通过了不断的优化升级实现了一个3种方案都支持的CMDB系统,我们用哪种方案只需要在配置文件里修改一下设置就行了. 同时我们 ...
- 自动备份远程mongodb数据库并拉取到本地
自动备份远程mongodb数据库并拉取到本地 目标: 远程服务器 .1中的mongodb数据拉回公司测试服务器中 .远程服务器中编写自动备份mongodb脚本 ①编写脚本 # vim /opt/bac ...