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 -> 无意义,防止报错

原文地址:https://www.cnblogs.com/sabertobih/p/14001250.html