热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

SpringBoot整合Hbase的实现示例

这篇文章主要介绍了SpringBoot整合Hbase的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

简介

当单表数据量过大的时候,关系性数据库会出现性能瓶颈,这时候我们就可以用NoSql,比如Hbase就是一个不错的解决方案。接下来是用Spring整合Hbase的实际案例,且在最后会给出整合中可能会出现的问题,以及解决方案。这里我是用本地Windows的IDEA,与局域网的伪分布Hbase集群做的连接,其中Hbase集群包括的组件有:Jdk1.8、Hadoop2.7.6、ZooKeeper3.4.10、Hbase2.0.1,因为这里只是开发环境,所以做一个伪分布的就好,之后部署的时候再按生产环境要求来即可

整合步骤

目录结构

在这里插入图片描述

pom.xml

这里要导入Hbase连接所需要包,需要找和你Hbase版本一致的包


 org.apache.hbase
 hbase-client
 2.0.1

hbase-site.xml

我是用的配置文件连接方法,这个配置文件你在hbase的安装目录下的conf目录就可以找到,然后你直接把它复制到项目的resources目录下就好,当然你也可以用application.properties配置文件外加注入和代码的方式代替这个配置文件

HBaseConfig.java

这里因为只需连接Hbase就没连接Hadoop,如果要连接Hadoop,Windows下还要下载winutils.exe工具,后面会介绍

@Configuration
public class HBaseConfig {
 @Bean
 public HBaseService getHbaseService() {
  //设置临时的hadoop环境变量,之后程序会去这个目录下的\bin目录下找winutils.exe工具,windows连接hadoop时会用到
  //System.setProperty("hadoop.home.dir", "D:\\Program Files\\Hadoop");
  //执行此步时,会去resources目录下找相应的配置文件,例如hbase-site.xml
  org.apache.hadoop.conf.Configuration cOnf= HBaseConfiguration.create();
  return new HBaseService(conf);
 }
}

HBaseService.java

这是做连接后的一些操作可以参考之后自己写一下

public class HBaseService {
 private Logger log = LoggerFactory.getLogger(HBaseService.class);
 /**
  * 管理员可以做表以及数据的增删改查功能
  */
 private Admin admin = null;
 private Connection cOnnection= null;
 public HBaseService(Configuration conf) {
  try {
   cOnnection= ConnectionFactory.createConnection(conf);
   admin = connection.getAdmin();
  } catch (IOException e) {
   log.error("获取HBase连接失败!");
  }
 }
 /**
  * 创建表 create , {NAME => , VERSIOnS=> }
  */
 public boolean creatTable(String tableName, List columnFamily) {
  try {
   //列族column family
   List cfDesc = new ArrayList<>(columnFamily.size());
   columnFamily.forEach(cf -> {
    cfDesc.add(ColumnFamilyDescriptorBuilder.newBuilder(
      Bytes.toBytes(cf)).build());
   });
   //表 table
   TableDescriptor tableDesc = TableDescriptorBuilder
     .newBuilder(TableName.valueOf(tableName))
     .setColumnFamilies(cfDesc).build();
   if (admin.tableExists(TableName.valueOf(tableName))) {
    log.debug("table Exists!");
   } else {
    admin.createTable(tableDesc);
    log.debug("create table Success!");
   }
  } catch (IOException e) {
   log.error(MessageFormat.format("创建表{0}失败", tableName), e);
   return false;
  } finally {
   close(admin, null, null);
  }
  return true;
 }
 /**
  * 查询所有表的表名
  */
 public List getAllTableNames() {
  List result = new ArrayList<>();
  try {
   TableName[] tableNames = admin.listTableNames();
   for (TableName tableName : tableNames) {
    result.add(tableName.getNameAsString());
   }
  } catch (IOException e) {
   log.error("获取所有表的表名失败", e);
  } finally {
   close(admin, null, null);
  }
  return result;
 }
 /**
  * 遍历查询指定表中的所有数据
  */
 public Map> getResultScanner(String tableName) {
  Scan scan = new Scan();
  return this.queryData(tableName, scan);
 }
 /**
  * 通过表名及过滤条件查询数据
  */
 private Map> queryData(String tableName, Scan scan) {
  // 
  Map> result = new HashMap<>();
  ResultScanner rs = null;
  //获取表
  Table table = null;
  try {
   table = getTable(tableName);
   rs = table.getScanner(scan);
   for (Result r : rs) {
    // 每一行数据
    Map columnMap = new HashMap<>();
    String rowKey = null;
    // 行键,列族和列限定符一起确定一个单元(Cell)
    for (Cell cell : r.listCells()) {
     if (rowKey == null) {
      rowKey = Bytes.toString(cell.getRowArray(), cell.getRowOffset(), cell.getRowLength());
     }
     columnMap.put(
       //列限定符
       Bytes.toString(cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength()),
       //列族
       Bytes.toString(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength()));
    }
    if (rowKey != null) {
     result.put(rowKey, columnMap);
    }
   }
  } catch (IOException e) {
   log.error(MessageFormat.format("遍历查询指定表中的所有数据失败,tableName:{0}", tableName), e);
  } finally {
   close(null, rs, table);
  }
  return result;
 }
 /**
  * 为表添加或者更新数据
  */
 public void putData(String tableName, String rowKey, String familyName, String[] columns, String[] values) {
  Table table = null;
  try {
   table = getTable(tableName);
   putData(table, rowKey, tableName, familyName, columns, values);
  } catch (Exception e) {
   log.error(MessageFormat.format("为表添加 or 更新数据失败,tableName:{0},rowKey:{1},familyName:{2}", tableName, rowKey, familyName), e);
  } finally {
   close(null, null, table);
  }
 }
 private void putData(Table table, String rowKey, String tableName, String familyName, String[] columns, String[] values) {
  try {
   //设置rowkey
   Put put = new Put(Bytes.toBytes(rowKey));
   if (columns != null && values != null && columns.length == values.length) {
    for (int i = 0; i 

HBaseApplicationTests.java

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
class HBaseApplicationTests {
 @Resource
 private HBaseService hbaseService;
 //测试创建表
 @Test
 public void testCreateTable() {
  hbaseService.creatTable("test_base", Arrays.asList("a", "back"));
 }
 //测试加入数据
 @Test
 public void testPutData() {
  hbaseService.putData("test_base", "000001", "a", new String[]{
    "project_id", "varName", "coefs", "pvalues", "tvalues",
    "create_time"}, new String[]{"40866", "mob_3", "0.9416",
    "0.0000", "12.2293", "null"});
  hbaseService.putData("test_base", "000002", "a", new String[]{
    "project_id", "varName", "coefs", "pvalues", "tvalues",
    "create_time"}, new String[]{"40866", "idno_prov", "0.9317",
    "0.0000", "9.8679", "null"});
  hbaseService.putData("test_base", "000003", "a", new String[]{
    "project_id", "varName", "coefs", "pvalues", "tvalues",
    "create_time"}, new String[]{"40866", "education", "0.8984",
    "0.0000", "25.5649", "null"});
 }
 //测试遍历全表
 @Test
 public void testGetResultScanner() {
  Map> result2 = hbaseService.getResultScanner("test_base");
  System.out.println("-----遍历查询全表内容-----");
  result2.forEach((k, value) -> {
   System.out.println(k + "--->" + value);
  });
 }
}

运行结果

Hbase数据库查询结果

在这里插入图片描述

IDEA的遍历结果

在这里插入图片描述

报错与解决方案

报错一

在这里插入图片描述

解决方案:

这是参数配置的有问题,如果你是用hbase-site.xml配置文件配置的参数,那么检查它,用代码配置就检查代码参数

报错二

在这里插入图片描述

解决方案:

更改windows本地hosts文件,C:\Windows\System32\drivers\etc\hosts,添加Hbase服务所在主机地址与主机名称,这里你如果保存不了hosts文件,把它拉出到桌面改好再拉回即可

报错三

在这里插入图片描述

解决方案:

这是因为在Windows下连接Hadoop需要一个叫Winutils.exe的工具,并且从源代码可知,它会去读你Windows下的环境变量,如果你不想在本地设置,可以用方法System.setProperty()设置实时环境变量,另外,如果你只用Hbase,其实这个报错并不影响你使用Hbase服务

代码地址

https://github.com/xiaoxiamo/SpringBoot_HBase

到此这篇关于SpringBoot整合Hbase的实现示例的文章就介绍到这了,更多相关SpringBoot整合Hbase内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!


推荐阅读
  • 本文详细介绍了 Apache ZooKeeper 的 FileTxnLog 类中的 setPreallocSize 方法,并提供了多个实际应用中的代码示例。通过这些示例,读者可以更好地理解如何在不同场景下合理设置日志文件的预分配大小。 ... [详细]
  • HBase运维工具全解析
    本文深入探讨了HBase常用的运维工具,详细介绍了每种工具的功能、使用场景及操作示例。对于HBase的开发人员和运维工程师来说,这些工具是日常管理和故障排查的重要手段。 ... [详细]
  • 本文详细介绍了 Java 中的 org.apache.hadoop.registry.client.impl.zk.ZKPathDumper 类,提供了丰富的代码示例和使用指南。通过这些示例,读者可以更好地理解如何在实际项目中利用 ZKPathDumper 类进行注册表树的转储操作。 ... [详细]
  • 简化报表生成:EasyReport工具的全面解析
    本文详细介绍了EasyReport,一个易于使用的开源Web报表工具。该工具支持Hadoop、HBase及多种关系型数据库,能够将SQL查询结果转换为HTML表格,并提供Excel导出、图表显示和表头冻结等功能。 ... [详细]
  • 1整合dubbo1.1e3-manager-Service1.1.1pom.xml排除jar在e3-manager-Service工程中添加dubbo依赖的jar包。 ... [详细]
  • Hadoop发行版本选择指南:技术解析与应用实践
    本文详细介绍了Hadoop的不同发行版本及其特点,帮助读者根据实际需求选择最合适的Hadoop版本。内容涵盖Apache Hadoop、Cloudera CDH等主流版本的特性及应用场景。 ... [详细]
  • 本文详细探讨了 org.apache.hadoop.ha.HAServiceTarget 类中的 checkFencingConfigured 方法,包括其功能、应用场景及代码示例。通过实际代码片段,帮助开发者更好地理解和使用该方法。 ... [详细]
  • window下kafka的安装以及测试
    目录一、安装JDK(需要安装依赖javaJDK)二、安装Kafka三、测试参考在Windows系统上安装消息队列kafka一、安装JDKÿ ... [详细]
  • 优化使用Apache + Memcached-Session-Manager + Tomcat集群方案
    本文探讨了使用Apache、Memcached-Session-Manager和Tomcat集群构建高性能Web应用过程中遇到的问题及解决方案。通过重新设计物理架构,解决了单虚拟机环境无法真实模拟分布式环境的问题,并详细记录了性能测试结果。 ... [详细]
  • 如何构建基于Dubbo协议的示例项目
    本文详细介绍了构建基于Dubbo协议的示例项目的步骤,包括环境搭建、服务接口定义、服务实现、配置文件设置及客户端调用等环节,旨在为初学者提供一个清晰的学习路径。 ... [详细]
  • 本文基于https://major.io/2014/05/13/coreos-vs-project-atomic-a-review/的内容,对CoreOS和Atomic两个操作系统进行了详细的对比,涵盖部署、管理和安全性等多个方面。 ... [详细]
  • 本文详细记录了一次 HBase RegionServer 异常宕机的情况,包括具体的错误信息和可能的原因分析。通过此案例,探讨了如何有效诊断并解决 HBase 中常见的 RegionServer 挂起问题。 ... [详细]
  • 全面解析运维监控:白盒与黑盒监控及四大黄金指标
    本文深入探讨了白盒和黑盒监控的概念,以及它们在系统监控中的应用。通过详细分析基础监控和业务监控的不同采集方法,结合四个黄金指标的解读,帮助读者更好地理解和实施有效的监控策略。 ... [详细]
  • 本文详细介绍了使用ZooKeeper构建高可用集群的方法,包括必要的软件环境准备、配置文件调整及集群启动等关键步骤。通常,一个ZooKeeper集群由奇数个节点组成,以确保Leader选举的有效性。 ... [详细]
  • Spring Cloud Config: 高效统一的配置管理解决方案
    Spring Cloud Config 是一个用于集中管理和分发应用程序配置的工具,支持多环境下的配置管理(如开发、测试和生产环境),并且能够根据需求动态调整配置参数(例如,在大型促销活动期间增加数据库的最大连接数)。 ... [详细]
author-avatar
Christy-1221
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有