测试环境:Idea+Windows10

准备工作:

<1>、打开本地 C:\Windows\System32\drivers\etc(系统默认)下名为hosts的系统文件,如果提示当前用户没有权限打开文件;第一种方法是将hosts文件拖到桌面进行配置后再拖回原处;第二种一劳永逸的方法是修改当前用户对该文件的权限为完全控制;

<2>、打开后hosts文件后,添加HBase集群服务器的用户名及IP地址如下:

<3>、由于是windows系统下远程连接HBase,而HBase底层依赖Hadoop,所以需要下载hadoop二进制包存放到本地目录将来会在程序中引用该目录,否则会报错。你也可以理解为windows下需要模拟linux环境才能正常连接HBasehadoop;(注:windows下的版本需要和linux下一致,这里我仅仅提供的2.6.0hadoop版本解析包)

程序代码:

pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>spring_hbase</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><name>spring_hbase</name><description>Demo project for Spring Boot</description><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.4.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!--HBase依赖--><dependency><groupId>org.apache.hbase</groupId><artifactId>hbase-client</artifactId><version>1.2.0</version><exclusions><exclusion><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-hadoop</artifactId><version>2.5.0.RELEASE</version></dependency><dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-hdfs</artifactId><version>2.5.1</version></dependency><dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-hadoop-core</artifactId><version>2.4.0.RELEASE</version></dependency><dependency><groupId>org.apache.hbase</groupId><artifactId>hbase</artifactId><version>1.2.1</version><type>pom</type></dependency><!--HBase依赖--></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

HBaseUtils.class:

package com.example.spring_hbase;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.springframework.data.hadoop.hbase.HbaseTemplate;import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Properties;/*** HBase工具类* Author JiaPeng_lv*/
public class HBaseUtils {private static Connection connection;private static Configuration configuration;private static HBaseUtils hBaseUtils;private static Properties properties;/*** 创建连接池并初始化环境配置*/public void init(){properties = System.getProperties();//实例化HBase配置类if (configuration==null){configuration = HBaseConfiguration.create();}try {//加载本地hadoop二进制包properties.setProperty("hadoop.home.dir", "D:\\hadoop-common-2.6.0-bin-master");//zookeeper集群的URL配置信息configuration.set("hbase.zookeeper.quorum","k1,k2,k3,k4,k5");//HBase的Masterconfiguration.set("hbase.master","hba:60000");//客户端连接zookeeper端口configuration.set("hbase.zookeeper.property.clientPort","2181");//HBase RPC请求超时时间,默认60s(60000)configuration.setInt("hbase.rpc.timeout",20000);//客户端重试最大次数,默认35configuration.setInt("hbase.client.retries.number",10);//客户端发起一次操作数据请求直至得到响应之间的总超时时间,可能包含多个RPC请求,默认为2minconfiguration.setInt("hbase.client.operation.timeout",30000);//客户端发起一次scan操作的rpc调用至得到响应之间的总超时时间configuration.setInt("hbase.client.scanner.timeout.period",200000);//获取hbase连接对象if (connection==null||connection.isClosed()){connection = ConnectionFactory.createConnection(configuration);}} catch (IOException e) {e.printStackTrace();}}/*** 关闭连接池*/public static void close(){try {if (connection!=null)connection.close();} catch (IOException e) {e.printStackTrace();}}/*** 私有无参构造方法*/private HBaseUtils(){}/*** 唯一实例,线程安全,保证连接池唯一* @return*/public static HBaseUtils getInstance(){if (hBaseUtils == null){synchronized (HBaseUtils.class){if (hBaseUtils == null){hBaseUtils = new HBaseUtils();hBaseUtils.init();}}}return hBaseUtils;}/*** 获取单条数据* @param tablename* @param row* @return* @throws IOException*/public static Result getRow(String tablename, byte[] row) throws IOException{Table table = null;Result result = null;try {table = connection.getTable(TableName.valueOf(tablename));Get get = new Get(row);result = table.get(get);}finally {table.close();}return result;}/*** 查询多行信息* @param tablename* @param rows* @return* @throws IOException*/public static Result[] getRows(String tablename,List<byte[]> rows) throws  IOException{Table table = null;List<Get> gets = null;Result[] results = null;try {table = connection.getTable(TableName.valueOf(tablename));gets = new ArrayList<Get>();for (byte[] row : rows){if(row!=null){gets.add(new Get(row));}}if (gets.size() > 0) {results = table.get(gets);}} catch (IOException e) {e.printStackTrace();}finally {table.close();}return results;}/*** 获取整表数据* @param tablename* @return*/public static ResultScanner get(String tablename) throws IOException{Table table = null;ResultScanner results = null;try {table = connection.getTable(TableName.valueOf(tablename));Scan scan = new Scan();scan.setCaching(1000);results = table.getScanner(scan);} catch (IOException e) {e.printStackTrace();}finally {table.close();}return results;}/*** 单行插入数据* @param tablename* @param rowkey* @param family* @param cloumns* @throws IOException*/public static void put(String tablename, String rowkey, String family, Map<String,String> cloumns) throws IOException{Table table = null;try {table = connection.getTable(TableName.valueOf(tablename));Put put = new Put(rowkey.getBytes());for (Map.Entry<String,String> entry : cloumns.entrySet()){put.addColumn(family.getBytes(),entry.getKey().getBytes(),entry.getValue().getBytes());}table.put(put);} catch (IOException e) {e.printStackTrace();}finally {table.close();close();}}
}

①、保证该工具类唯一实例

②、全局共享重量级类Connection,该类为线程安全,使用完毕后关闭连接池

③、每次执行内部CRUD方法会创建唯一对象Table,该类为非线程安全,使用完毕后关闭

由于时间原因,内部功能方法及测试较少,有其他需求的可以自行百度添加更多方法,这里主要以类结构及配置为主。

Test.class:

package com.example.spring_hbase;import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.util.Bytes;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;import java.io.IOException;
import java.util.*;@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringHbaseApplicationTests {@Testpublic void contextLoads() {}@Testpublic void test01(){HBaseUtils.getInstance();try {Long time = System.currentTimeMillis();Result result = HBaseUtils.getRow("GPS_MAP", Bytes.toBytes(1));System.out.println("本次查询耗时:"+(System.currentTimeMillis()-time)*1.0/1000+"s");NavigableMap<byte[],NavigableMap<byte[],NavigableMap<Long,byte[]>>> navigableMap = result.getMap();for (byte[] family:navigableMap.keySet()){System.out.println("columnFamily:"+ new String(family));for (byte[] column : navigableMap.get(family).keySet()){System.out.println("column:"+new String(column));for (Long t : navigableMap.get(family).get(column).keySet()){System.out.println("value:"+new String(navigableMap.get(family).get(column).get(t)));}}}} catch (IOException e) {e.printStackTrace();}finally {HBaseUtils.close();}}@Testpublic void test02(){HBaseUtils.getInstance();ResultScanner results = null;try {Long time = System.currentTimeMillis();results = HBaseUtils.get("GPS_MAP");System.out.println("本次查询耗时:"+(System.currentTimeMillis()-time)*1.0/1000+"s");for (Result result : results){NavigableMap<byte[],NavigableMap<byte[],NavigableMap<Long,byte[]>>> navigableMap = result.getMap();for (byte[] family:navigableMap.keySet()){System.out.println("columnFamily:"+ new String(family));for (byte[] column : navigableMap.get(family).keySet()){System.out.println("column:"+new String(column));for (Long t : navigableMap.get(family).get(column).keySet()){System.out.println("value:"+new String(navigableMap.get(family).get(column).get(t)));}}}}} catch (IOException e) {e.printStackTrace();}finally {results.close();HBaseUtils.close();}}@Testpublic void test03(){HBaseUtils.getInstance();Result[] results = null;List<byte[]> list = null;try {list = new ArrayList<byte[]>();list.add(Bytes.toBytes(1));list.add(Bytes.toBytes(2));Long time = System.currentTimeMillis();results = HBaseUtils.getRows("GPS_MAP",list);System.out.println("本次查询耗时:"+(System.currentTimeMillis()-time)*1.0/1000+"s");for (Result result : results){NavigableMap<byte[],NavigableMap<byte[],NavigableMap<Long,byte[]>>> navigableMap = result.getMap();for (byte[] family:navigableMap.keySet()){System.out.println("columnFamily:"+ new String(family));for (byte[] column : navigableMap.get(family).keySet()){System.out.println("column:"+new String(column));for (Long t : navigableMap.get(family).get(column).keySet()){System.out.println("value:"+new String(navigableMap.get(family).get(column).get(t)));}}}}} catch (IOException e) {e.printStackTrace();}finally {HBaseUtils.close();}}@Testpublic void test04(){HBaseUtils.getInstance();try {Map<String,String> cloumns = new HashMap<String, String>();cloumns.put("test01","test01");cloumns.put("test02","test02");Long time = System.currentTimeMillis();HBaseUtils.put("GPS_MAP","3","TEST",cloumns);System.out.println("本次插入耗时:"+(System.currentTimeMillis()-time)*1.0/1000+"s");} catch (IOException e) {e.printStackTrace();}finally {HBaseUtils.close();}}
}

测试后发现查询和插入效率相对于没有优化过的类耗时大大缩减;

Java客户端访问HBase集群解决方案(优化)相关推荐

  1. Java API访问HDFS集群(HA)

    title: Java API访问HDFS集群(HA) date: 2021-06-23 17:06:11 tags: HDFS hadoopV2版本及以后都是HA架构,active namenode ...

  2. Hadoop HBase概念学习系列之HBase里的客户端和HBase集群建立连接(详细)(十四)...

    需要遵循以下步骤: 1.客户端和Zookeeper集群建立连接.在这之前客户端需要获得一些信息(可以从HBase配置文件中读取或是直接指定).客户端从Zookeeper集群中读取-ROOT-表的位置信 ...

  3. Hadoop(八)Java程序访问HDFS集群中数据块与查看文件系统

    阅读目录(Content) 一.HDFS中数据块概述 1.1.HDFS集群中数据块存放位置 1.2.数据块(data block)简介 1.3.对分布式文件系统中的块进行抽象会带来很多好处 二.Jav ...

  4. 通过java 客户端 操作k8s集群

    1.在diea中新建一个maven工程然后倒入一下依赖 <dependency><groupId>io.kubernetes</groupId><artifa ...

  5. tcp out of order解决_分布式集群解决方案 学习笔记

    回到目录: OrangeZh:拉勾教育:JAVA高薪训练营 学习技术篇​zhuanlan.zhihu.com 介绍 文章内容输出来源:拉勾教育 Java高薪训练营 分布式集群解决方案相关 什么是分布式 ...

  6. Phoenix连接安全模式下的HBase集群

    Phoenix连接安全模式下的HBase集群 HBase集群开启安全模式(即启用kerberos认证)之后,用户无论是用HBase shell还是Phoenix去连接HBase都先需要通过kerber ...

  7. 访问hadoop集群时错误:Access denied for user Administrator. Superuser privilege is required

    hadoop集群搭建好后,本地通过java api访问hadoop集群,java代码如下(查看hadoop集群上所有节点名称信息) import org.apache.hadoop.conf.Conf ...

  8. hbase集群 数据写入_一种构建HBase集群全文索引方法,数据读取方法以及数据写入方法与流程...

    本发明涉及HBase集群领域,尤其涉及一种构建HBase集群全文索引方法,数据读取方法以及数据写入方法. 背景技术: 随着云计算技术的不断发展,云计算技术不断落地成为支撑各行业信息技术发展的重要支柱. ...

  9. hadoop java访问_Hadoop(五)搭建Hadoop客户端与Java访问HDFS集群

    上一篇详细介绍了HDFS集群,还有操作HDFS集群的一些命令,常用的命令: hdfs dfs -ls xxx hdfs dfs -mkdir -p /xxx/xxx hdfs dfs -cat xxx ...

最新文章

  1. 非技术成本继续困扰光伏产业
  2. JPA学习(6)JPQL
  3. Serializable在C#中的作用及其优点
  4. WebServices 基础知识
  5. tablediff同步
  6. scpi指令转换c语言,[C#源代码]使用SCPI指令对通讯端口(RS232/USB/GPIB/LAN)进行仪器编程...
  7. apache sentry
  8. 联想“重组症”:仅靠重组是不够的
  9. 写给立志做码农的大学生
  10. 芯片学生党必会的行业英文术语
  11. FxFactory 7 for Mac(视觉特效软件包)
  12. python基于opencv的手势识别_求python opencv 手势识别源代码
  13. #八、古老的查表计算器--图表
  14. pkpm板按弹性计算还是塑性_请教:筏板是按弹性算法?还是塑性算法?那个好些?...
  15. HDU-6121 Build a tree - 2017 Multi-University Training Contest - Team 7(完全K叉树)
  16. 恋恋有词 - 高频版
  17. 广东开放大学信息安全与计算机科学那个好,贺桂英-广东开放大学信息与工程学院...
  18. 20172303 20172322 2017-2018-2 暑假作业 结对编程项目-舒尔特方格(增补:计时器的加入与页面优化)...
  19. 电子信息工程(一)为什么选择这个专业
  20. 大数据下的帝都魔都的爱恨情仇

热门文章

  1. mysql主主和F5高可用_MYSQL 主主热备高可用方案与实现
  2. eeglab教程系列(5)-预处理工具
  3. 用耳朵“打字”| 这个设备可以让患者实现用耳朵进行交流
  4. 华人开发世界最小电池,直径细如灰尘,可集成在芯片上供电10小时
  5. GitHub换帅!开源大神辞任CEO,竞品GitLab刚完成IPO
  6. 开源代码维护人员大诉苦水,超半正考虑或已经决定放弃
  7. 挤牙膏只服英特尔!新酷睿14nm+++,性能竟超过AMD 7nm?
  8. 谁是2020年最强Python库?年度Top10出炉
  9. 叶杰平入选、华人占4成,2020年ACM杰出科学家榜单出炉
  10. NeurIPS 2020中国入选论文:新一代算法“鉴黄师”诞生,中科院计算所研究生一作...