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

  • 相关阅读:
    Django model转字典的几种方法
    使用Nagios打造专业的业务状态监控
    Etcd安全配置之Basic Auth认证
    ELK日志系统之通用应用程序日志接入方案
    ELK日志系统之使用Rsyslog快速方便的收集Nginx日志
    中小团队落地配置中心详解
    ELK构建MySQL慢日志收集平台详解
    Django model select的各种用法详解
    Python:每日一题003
    Python:每日一题002
  • 原文地址:https://www.cnblogs.com/sabertobih/p/14001250.html
Copyright © 2020-2023  润新知