hbase(四)Java操作 hbase(工厂模式)& 调优方法
一、第一版本
二、第二版本
(一)优化架构
(二)优化运行时间
1. 测算运行时间,推算什么流程耗时间,有问题。
-
- 时间戳相减,测算运行时间
- 创建对象慢,考虑连接池
2. 优化流程
1)只有一个连接:把Connection对象放在static代码块中创建(静态变量和静态代码块按照写的顺序执行)
-
- 想在静态块里用传参形式创建conn对象,考虑读配置。
3)只有一个连接:每一次从获取连接到结束,浪费时间 => 自己写连接池
2)是否读配置比传参数类浪费时间?时间戳相减,测算运行时间
-
- 测算结果时间应该是没有差别的
package com.njbdqn.services.impl; import com.njbdqn.services.ConnectionBuilder; import com.njbdqn.services.utils.Commons; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.client.Connection; import org.apache.hadoop.hbase.client.ConnectionFactory; import java.io.IOException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * hbase 制造Connection */ public class HBaseConnection<T> implements ConnectionBuilder<Connection> { // 静态代码块和静态变量的顺序是按照写的先后顺序 private static Connection conn = null; // static{} Conn,但是需要构造器传入Configuration。 // 写死我可以用,但我不想写死! // 怎么办啊?有没有好主意啊? // 读配置文件吧! static { Commons commons = Commons.getInstance(); long time = System.currentTimeMillis(); Configuration conf = HBaseConfiguration.create(); conf.set("hbase.zookeeper.property.clientPort",commons.getProperties("hbase.zk.port")); conf.set("hbase.zookeeper.quorum",commons.getProperties("hbase.zk.hosts")); conf.set("hbase.master",commons.getProperties("hbase.hmaster")); long time1 = System.currentTimeMillis(); // 到底造了几个连接? 1个连接,该连接中有thread pool可以batch operations ExecutorService pool = Executors.newFixedThreadPool(30); try { conn = ConnectionFactory.createConnection(conf, pool); } catch (IOException e) { e.printStackTrace(); } long time2 = System.currentTimeMillis(); System.out.println("读取配置:"+(time1-time)+",创建对象:"+(time2-time1)); } @Override public Connection getConnection() { return conn; } }
三、第三版本,优化:batch insert
将第二版本install,打成maven jar包,给以后的第三版本当作依赖继续优化
最好打瘦包,防止以后依赖需要升级,还需重新打包
DatabaseHandler -> 抽象接口
HbaseDbHandlerTemplate -> 实现类
@Override public void batchAdd(List<T> lst) { try { Connection tmpcon = builder.getConnection(); Table tab = tmpcon.getTable(TableName.valueOf(tableName)); List<Put> puts = ibdh.batchInsert(lst); tab.put(puts); // Hbase提供的批量插入 void put(List<Put> var1) throws IOException; } catch (IOException e) { e.printStackTrace(); } }
MysqlDbHandlerTemplate -> 无意义,防止报错
IHBaseDataHandler -> 抽象接口
以上都添加 List<Put> batchInsert(List<T> lst);
MytestHandler 中添加@override -> 无意义,防止报错