zoukankan      html  css  js  c++  java
  • 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 -> 无意义,防止报错

  • 相关阅读:
    git线上操作
    IDEA快捷方式
    Java 四种线程池
    java 获取当前天之后或之前7天日期
    如何理解AWS 网络,如何创建一个多层安全网络架构
    申请 Let's Encrypt 通配符 HTTPS 证书
    GCE 部署 ELK 7.1可视化分析 nginx
    使用 bash 脚本把 AWS EC2 数据备份到 S3
    使用 bash 脚本把 GCE 的数据备份到 GCS
    nginx 配置 https 并强制跳转(lnmp一键安装包)
  • 原文地址:https://www.cnblogs.com/sabertobih/p/14001250.html
Copyright © 2011-2022 走看看