Hbase数据库完全分布式搭建以及java中操作Hbase

简介: Hbase数据库完全分布式搭建以及java中操作Hbase

文章目录

1.基础的环境准备

基础的环境准备不在赘述,包括jdk安装,防火墙关闭,网络配置,环境变量的配置,各个节点之间进行免密等操作等。使用的版本2.0.5.

2.完全分布式 Fully-distributed

参考官方文档

分布式的部署,都是在单节点服务的基础配置好配置,直接分发到其他节点即可。

2.1 配置文件hase-env.sh

jdk路径的配置,以及不适用内部自带的zk.

export JAVA_HOME=/usr/java/default

export HBASE_MANAGES_ZK=false

2.2 hbase-site.xml

<configuration>

 <property>

   <name>hbase.rootdir</name>

   <value>hdfs://muycluster/hbase</value>

 </property>

 <property>

   <name>hbase.cluster.distributed</name>

   <value>true</value>

 </property>

 <property>

   <name>hbase.zookeeper.quorum</name>

   <value>node02,node03,node04</value>

 </property>

</configuration>

2.3 配置regionservers

配置集群regionserver的节点

node02

node03

node04

2.4 配置备用的master

conf/backup-masters

vi backup-masters

node03

2.5 HDFS客户端配置

官方提供三种方式进行配置

Add a pointer to your HADOOP_CONF_DIR to the HBASE_CLASSPATH environment variable in hbase-env.sh.


Add a copy of hdfs-site.xml (or hadoop-site.xml) or, better, symlinks, under ${HBASE_HOME}/conf, or


if only a small set of HDFS client configurations, add them to hbase-site.xml.

一般我们都选择第二种,直接将hadoop-site.xml配置拷贝到 ${HBASE_HOME}/conf即可

2.6 启动

[root@node01 /]# start-hbase.sh

SLF4J: Class path contains multiple SLF4J bindings.

SLF4J: Found binding in [jar:file:/opt/bigdata/hbase-2.0.5/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]

SLF4J: Found binding in [jar:file:/opt/bigdata/hadoop-2.6.5/share/hadoop/common/lib/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]

SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.

SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]

running master, logging to /opt/bigdata/hbase-2.0.5/logs/hbase-root-master-node01.out

SLF4J: Class path contains multiple SLF4J bindings.

SLF4J: Found binding in [jar:file:/opt/bigdata/hbase-2.0.5/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]

SLF4J: Found binding in [jar:file:/opt/bigdata/hadoop-2.6.5/share/hadoop/common/lib/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]

SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.

SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]

node02: running regionserver, logging to /opt/bigdata/hbase-2.0.5/bin/../logs/hbase-root-regionserver-node02.out

node04: running regionserver, logging to /opt/bigdata/hbase-2.0.5/bin/../logs/hbase-root-regionserver-node04.out

node03: running regionserver, logging to /opt/bigdata/hbase-2.0.5/bin/../logs/hbase-root-regionserver-node03.out

node04: running master, logging to /opt/bigdata/hbase-2.0.5/bin/../logs/hbase-root-master-node04.out

2.7 通过页面查看节点信息

2e4fa260348b4de3a675f9719ee01015.png

3. java中客户端操作Hbase

3.1 引入依赖

  <!-- https://mvnrepository.com/artifact/org.apache.hbase/hbase-client -->

   <dependency>

     <groupId>org.apache.hbase</groupId>

     <artifactId>hbase-client</artifactId>

     <version>2.0.5</version>

   </dependency>

   <dependency>

     <groupId>org.apache.hbase</groupId>

     <artifactId>hbase-mapreduce</artifactId>

     <version>2.0.5</version>

   </dependency>

3.2 初始化创建连接

操作表Java API中主要提供了一个Admin对象进行表的 操作。


HBase schemas can be created or updated using the The Apache HBase Shell or by using Admin in the Java API.

  Configuration conf = null;

   Connection conn = null;

   //表的管理对象

   Admin admin = null;

   Table table = null;

   //创建表的对象

   TableName tableName = TableName.valueOf("user");

   @Before

   public void init() throws IOException {

       //创建配置文件对象

       conf = HBaseConfiguration.create();

       //加载zookeeper的配置

       conf.set("hbase.zookeeper.quorum","node02,node03,node04");

       //获取连接

       conn = ConnectionFactory.createConnection(conf);

       //获取对象

       admin = conn.getAdmin();

       //获取数据操作对象

       table = conn.getTable(tableName);

   }

3.3 操作Hbase数据库

3.3.1 创建表

/**

    * 创建表 主要使用Admin对象进行表的创建

    * @throws IOException

    */

   @Test

   public void createTable() throws IOException {

       //定义表描述对象

       TableDescriptorBuilder tableDescriptorBuilder = TableDescriptorBuilder.newBuilder(tableName);

       //定义列族描述对象

       ColumnFamilyDescriptorBuilder columnFamilyDescriptorBuilder = ColumnFamilyDescriptorBuilder.newBuilder("cf".getBytes());

       //添加列族信息给表

       tableDescriptorBuilder.setColumnFamily(columnFamilyDescriptorBuilder.build());

       if(admin.tableExists(tableName)){

           //禁用表

           admin.disableTable(tableName);

           admin.deleteTable(tableName);

       }

       //创建表

       admin.createTable(tableDescriptorBuilder.build());

   }

3.3.2 往创建的user表插入数据

 @Test

   public void insert() throws IOException {

       Put put = new Put(Bytes.toBytes("row1"));

       put.addColumn(Bytes.toBytes("cf"),Bytes.toBytes("name"),Bytes.toBytes("elite"));

       put.addColumn(Bytes.toBytes("cf"),Bytes.toBytes("age"),Bytes.toBytes("22"));

       put.addColumn(Bytes.toBytes("cf"),Bytes.toBytes("address"),Bytes.toBytes("gz"));

       table.put(put);

   }


e5ac9500eafe4e42b130953ae2e727d1.png

3.3.3 使用get 查询单条数据

@Test

   public void get() throws IOException {

       Get get = new Get(Bytes.toBytes("row1"));

       //在服务端做数据过滤,挑选出符合需求的列

       get.addColumn(Bytes.toBytes("cf"),Bytes.toBytes("name"));

       get.addColumn(Bytes.toBytes("cf"),Bytes.toBytes("age"));

       get.addColumn(Bytes.toBytes("cf"),Bytes.toBytes("address"));

       Result result = table.get(get);

       Cell cell1 = result.getColumnLatestCell(Bytes.toBytes("cf"),Bytes.toBytes("name"));

       Cell cell2 = result.getColumnLatestCell(Bytes.toBytes("cf"),Bytes.toBytes("age"));

       Cell cell3 = result.getColumnLatestCell(Bytes.toBytes("cf"),Bytes.toBytes("address"));

       System.out.print(Bytes.toString(CellUtil.cloneValue(cell1))+" ");

       System.out.print(Bytes.toString(CellUtil.cloneValue(cell2))+" ");

       System.out.print(Bytes.toString(CellUtil.cloneValue(cell3)));

   }

3.3.4 scan 查询数据

 /**

    * 获取表中所有的记录

    */

   @Test

   public void scan() throws IOException {

       Scan scan = new Scan();

       ResultScanner rss = table.getScanner(scan);

       for (Result rs: rss) {

           Cell cell1 = rs.getColumnLatestCell(Bytes.toBytes("cf"),Bytes.toBytes("name"));

           Cell cell2 = rs.getColumnLatestCell(Bytes.toBytes("cf"),Bytes.toBytes("age"));

           Cell cell3 = rs.getColumnLatestCell(Bytes.toBytes("cf"),Bytes.toBytes("address"));

           System.out.print(Bytes.toString(CellUtil.cloneValue(cell1))+" ");

           System.out.print(Bytes.toString(CellUtil.cloneValue(cell2))+" ");

           System.out.println(Bytes.toString(CellUtil.cloneValue(cell3)));

       }

   }

3.3.5 删除数据

/**

    * 删除数据

    * @throws IOException

    */

   @Test

   public void delete() throws IOException {

       Delete delete = new Delete("row2".getBytes());

       table.delete(delete);

   }


3.4 关闭连接

@After

   public void close(){

       try {

           table.close();

       } catch (IOException e) {

           e.printStackTrace();

       }

       try {

           admin.close();

       } catch (IOException e) {

           e.printStackTrace();

       }

       try {

           conn.close();

       } catch (IOException e) {

           e.printStackTrace();

       }

   }


相关实践学习
lindorm多模间数据无缝流转
展现了Lindorm多模融合能力——用kafka API写入,无缝流转在各引擎内进行数据存储和计算的实验。
云数据库HBase版使用教程
&nbsp; 相关的阿里云产品:云数据库 HBase 版 面向大数据领域的一站式NoSQL服务,100%兼容开源HBase并深度扩展,支持海量数据下的实时存储、高并发吞吐、轻SQL分析、全文检索、时序时空查询等能力,是风控、推荐、广告、物联网、车联网、Feeds流、数据大屏等场景首选数据库,是为淘宝、支付宝、菜鸟等众多阿里核心业务提供关键支撑的数据库。 了解产品详情:&nbsp;https://cn.aliyun.com/product/hbase &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
1月前
|
关系型数据库 MySQL Java
【IDEA】java后台操作mysql数据库驱动常见错误解决方案
【IDEA】java后台操作mysql数据库驱动常见错误解决方案
68 0
|
10天前
|
XML Java 数据库连接
性能提升秘籍:如何高效使用Java连接池管理数据库连接
在Java应用中,数据库连接管理至关重要。随着访问量增加,频繁创建和关闭连接会影响性能。为此,Java连接池技术应运而生,如HikariCP。本文通过代码示例介绍如何引入HikariCP依赖、配置连接池参数及使用连接池高效管理数据库连接,提升系统性能。
38 5
|
22天前
|
SQL Java 数据库连接
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率。本文介绍了连接池的工作原理、优势及实现方法,并提供了HikariCP的示例代码。
37 3
|
22天前
|
存储 Java 关系型数据库
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践,包括连接创建、分配、复用和释放等操作,并通过电商应用实例展示了如何选择合适的连接池库(如HikariCP)和配置参数,实现高效、稳定的数据库连接管理。
41 2
|
22天前
|
Java 数据库连接 数据库
如何构建高效稳定的Java数据库连接池,涵盖连接池配置、并发控制和异常处理等方面
本文介绍了如何构建高效稳定的Java数据库连接池,涵盖连接池配置、并发控制和异常处理等方面。通过合理配置初始连接数、最大连接数和空闲连接超时时间,确保系统性能和稳定性。文章还探讨了同步阻塞、异步回调和信号量等并发控制策略,并提供了异常处理的最佳实践。最后,给出了一个简单的连接池示例代码,并推荐使用成熟的连接池框架(如HikariCP、C3P0)以简化开发。
45 2
|
24天前
|
Java 数据库连接 数据库
优化之路:Java连接池技术助力数据库性能飞跃
在Java应用开发中,数据库操作常成为性能瓶颈。频繁的数据库连接建立和断开增加了系统开销,导致性能下降。本文通过问题解答形式,深入探讨Java连接池技术如何通过复用数据库连接,显著减少连接开销,提升系统性能。文章详细介绍了连接池的优势、选择标准、使用方法及优化策略,帮助开发者实现数据库性能的飞跃。
27 4
|
1月前
|
缓存 NoSQL Java
大数据-50 Redis 分布式锁 乐观锁 Watch SETNX Lua Redisson分布式锁 Java实现分布式锁
大数据-50 Redis 分布式锁 乐观锁 Watch SETNX Lua Redisson分布式锁 Java实现分布式锁
61 3
大数据-50 Redis 分布式锁 乐观锁 Watch SETNX Lua Redisson分布式锁 Java实现分布式锁
|
22天前
|
Java 数据库连接 数据库
深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能
在Java应用开发中,数据库操作常成为性能瓶颈。本文通过问题解答形式,深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能。文章介绍了连接池的优势、选择和使用方法,以及优化配置的技巧。
22 1
|
22天前
|
Java 数据库连接 数据库
Java连接池在数据库性能优化中的重要作用。连接池通过预先创建和管理数据库连接,避免了频繁创建和关闭连接的开销
本文深入探讨了Java连接池在数据库性能优化中的重要作用。连接池通过预先创建和管理数据库连接,避免了频繁创建和关闭连接的开销,显著提升了系统的响应速度和吞吐量。文章介绍了连接池的工作原理,并以HikariCP为例,展示了如何在Java应用中使用连接池。通过合理配置和优化,连接池技术能够有效提升应用性能。
34 1
|
22天前
|
监控 Java 数据库连接
在Java开发中,数据库连接管理是关键问题之一
在Java开发中,数据库连接管理是关键问题之一。本文介绍了连接池技术如何通过预创建和管理数据库连接,提高数据库操作的性能和稳定性,减少资源消耗,并简化连接管理。通过示例代码展示了HikariCP连接池的实际应用。
19 1