Mac环境部署单机版Hbase及使用JavaAPI对Hbase增删改查

一、介绍

HBase 是一个面向列式存储的分布式数据库,其设计思想来源于 Google 的 BigTable 论文。HBase 底层存储基于 HDFS 实现,集群的管理基于 ZooKeeper 实现。HBase 良好的分布式架构设计为海量数据的快速存储、随机访问提供了可能,基于数据副本机制和分区机制可以轻松实现在线扩容、缩容和数据容灾,是大数据领域中 Key-Value 数据结构存储最常用的数据库方案。

Hbase官网:https://hbase.apache.org/
官方文档:https://hbase.apache.org/2.3/book.html
下载地址:https://archive.apache.org/dist/hbase/

Mac环境部署单机版Hbase及使用JavaAPI对Hbase增删改查_第1张图片

部署的hbase 版本为1.2.0

二、部署Hbase

2.1 Docker环境部署

# 拉取镜像
docker pull harisekhon/hbase:1.2
# 创建容器
docker run -d --name hbase -p 2181:2181 -p 16010:16010 -p 16020:16020 -p 16030:16030 harisekhon/hbase:1.2

docker容器运行后,直接在浏览器访问16010端口:
Mac环境部署单机版Hbase及使用JavaAPI对Hbase增删改查_第2张图片
Hbase部署成功了。

2.2 Linux环境部署

在Linux环境部署Hbase,需要Java环境。
解压Hbase压缩包,进入解压后的/etc目录:

  1. 配置 hbase-env.sh 脚本中的Java环境变量
    在这里插入图片描述
    Mac环境部署单机版Hbase及使用JavaAPI对Hbase增删改查_第3张图片
  2. 修改hbase-site.xml配置
<configuration>
  <property>
    <name>hbase.rootdirname>
    <value>file:///home/testuser/hbasevalue>
  property>
  <property>
    <name>hbase.zookeeper.property.dataDirname>
    <value>/home/testuser/zookeepervalue>
  property>
  <property>  
    <name>hbase.table.sanity.checksname>  
    <value>falsevalue>  
  property>  
configuration>
  1. 配置Hbase的环境变量
vim /etc/profile

export HBASE_HOME=/data/hbase/hbase-1.2.0
export PATH=$PATH:$JAVA_HOME/bin:$HBASE_HOME/bin

source /etc/profile

hbase version

Mac环境部署单机版Hbase及使用JavaAPI对Hbase增删改查_第4张图片

  1. 启动
# 直接使用 start-habse.sh 命令
start-habse.sh

启动报错了:
Mac环境部署单机版Hbase及使用JavaAPI对Hbase增删改查_第5张图片

解决方法:修改hbase-env.sh配置,找到这两行,将其注释掉即可。
在这里插入图片描述

# export HBASE_MASTER_OPTS="$HBASE_MASTER_OPTS -XX:PermSize=128m -XX:MaxPermSize=128m"
# export HBASE_REGIONSERVER_OPTS="$HBASE_REGIONSERVER_OPTS -XX:PermSize=128m -XX:MaxPermSize=128m"

再次启动即可,访问浏览器16010端口看到web页面表示部署成功。

2.3 Mac环境部署

同样在Mac本地部署Hbase也需要Java环境。

  1. 配置 hbase-env.sh 脚本中的Java环境变量,同时需要注释掉HBASE_MASTER_OPTSHBASE_REGIONSERVER_OPTS配置。
    Mac环境部署单机版Hbase及使用JavaAPI对Hbase增删改查_第6张图片
    在这里插入图片描述

  2. 修改hbase-site.xml配置
    由于home目录下创建文件夹没有权限,所以我在此处更改了文件目录位置。

<configuration>
  <property>
    <name>hbase.rootdirname>
    <value>file:///Users/LiuShihao/hbase/value>
  property>
  <property>
    <name>hbase.zookeeper.property.dataDirname>
    <value>/Users/LiuShihao/zookeepervalue>
  property>
  <property>  
    <name>hbase.table.sanity.checksname>  
    <value>falsevalue>  
  property>  
configuration>
  1. 配置环境变量 略

Mac环境部署单机版Hbase及使用JavaAPI对Hbase增删改查_第7张图片

2.4 hbase 命令行

docker 部署的Hbase需要通过docker exec -it hbase /bin/bash 进入Hbase容器内部执行hbase shell命令:
在这里插入图片描述
如果是Linux或者MacOS部署的,因为配置了环境变量,所以可以直接用hbase shell命令使用hbase 命令行。

注意:1版本删除命令需要加上Ctrl键,2版本不需要。

# 输入help显示hbase命令行
help
COMMAND GROUPS:
  Group name: general
  Commands: status, table_help, version, whoami

  Group name: ddl
  Commands: alter, alter_async, alter_status, create, describe, disable, disable_all, drop, drop_all, enable, enable_all, exists, get_table, is_disabled, is_enabled, list, locate_region, show_filters

  Group name: namespace
  Commands: alter_namespace, create_namespace, describe_namespace, drop_namespace, list_namespace, list_namespace_tables

  Group name: dml
  Commands: append, count, delete, deleteall, get, get_counter, get_splits, incr, put, scan, truncate, truncate_preserve

Mac环境部署单机版Hbase及使用JavaAPI对Hbase增删改查_第8张图片

2.4.1 创建表

# 表名first ,一个列族 cf1
create 'first','cf1'
# 表名second ,三个列族 cf1,cf2,cf3
create 'second','cf1','cf2','cf3'

Mac环境部署单机版Hbase及使用JavaAPI对Hbase增删改查_第9张图片

Mac环境部署单机版Hbase及使用JavaAPI对Hbase增删改查_第10张图片

Mac环境部署单机版Hbase及使用JavaAPI对Hbase增删改查_第11张图片

2.4.2 插入数据

# 使用put命令插入数据 user为表名 cf1 为列族名  zhangsan2为值
 put 'user',1,'cf1:name','zhangsan2'
# 使用scan查看表数据
scan 'user' 

Mac环境部署单机版Hbase及使用JavaAPI对Hbase增删改查_第12张图片

2.4.3 删除表

# 不能直接删除表,在删除表之前,需要表禁用
 disable 'first
 drop 'first'

Mac环境部署单机版Hbase及使用JavaAPI对Hbase增删改查_第13张图片

2.4.4 异写数据到磁盘

Mac环境部署单机版Hbase及使用JavaAPI对Hbase增删改查_第14张图片
/hbase-data/data/default/test/ac13d86e488d18593ca5f3c86db42287/cf目录下查看:
Mac环境部署单机版Hbase及使用JavaAPI对Hbase增删改查_第15张图片
在这里插入图片描述
此时发现cf中已经有数据了,是因为默认数据是在内存中,到达64M的时候才会进行异步写入到磁盘中。我们可以使用flush命令手动刷新。
Mac环境部署单机版Hbase及使用JavaAPI对Hbase增删改查_第16张图片

使用命令查看这个列族中的数据:

hbase hfile -p -f file:///hbase-data/data/default/test/ac13d86e488d18593ca5f3c86db42287/cf/2ec8665d6258433ca0966f33460ca9d8 

在这里插入图片描述

2.5 完全集群式部署: 略

配置两台服务器免密登录

# node01 和 node04 节点配置免密登录
# 在node04节点
ssh-kengen
ssh-copy-id -i .ssh/id_rsa.pub node01
# 输入node01密码 完成配置
# 配置完成后 ,连接node01
ssh node01

三、使用Java API操作Hbase

3.1 环境搭建

SpringBoot 版本 2.3.7.RELEASE
HbaseClient版本 1.2.6

3.1.1 pom.xml

引入依赖:
由于一系列的依赖冲突和版本问题,我排除hbase-client依赖包中的slf4j-log4j12guava,引入了低版本的guavaprotobuf-java依赖。

    <dependencies>
        <dependency>
            <groupId>org.apache.hbasegroupId>
            <artifactId>hbase-clientartifactId>
            <version>1.2.6version>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4jgroupId>
                    <artifactId>slf4j-log4j12artifactId>
                exclusion>
                <exclusion>
                    <groupId>com.google.guavagroupId>
                    <artifactId>guavaartifactId>
                exclusion>
            exclusions>
        dependency>
        
        <dependency>
            <groupId>com.google.guavagroupId>
            <artifactId>guavaartifactId>
            <version>16.0.1version>
        dependency>
        <dependency>
            <groupId>com.google.protobufgroupId>
            <artifactId>protobuf-javaartifactId>
            <version>2.5.0version>
        dependency>
    dependencies>

3.1.2 application.yml

server:
  port: 8099
hbase:
  config:
    hbase.zookeeper.quorum: localhost
    hbase.zookeeper.port: 2181

3.1.3 Hbase配置类

3.1.3.1 HbaseProperties
/**
 * @author :LiuShihao
 * @date :Created in 2022/6/23 11:47 下午
 * @desc :读取配置文件hbase的配置
 */
@ConfigurationProperties(prefix = "hbase")
public class HbaseProperties {
    private Map<String,String> config;

    public void setConfig(Map<String, String> config) {
        this.config = config;
    }

    public Map<String, String> getConfig() {
        return config;
    }
}
3.1.3.2 HbaseConfig
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.apache.hadoop.hbase.client.HBaseAdmin;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.io.IOException;
import java.util.Map;

/**
 * @author :LiuShihao
 * @date :Created in 2022/6/23 11:48 下午
 * @desc :配置Hbase
 */

@Configuration
@EnableConfigurationProperties(HbaseProperties.class)
public class HbaseConfig {
    private final HbaseProperties props;

    public HbaseConfig(HbaseProperties props) {
        this.props = props;
    }

    @Bean
    public org.apache.hadoop.conf.Configuration configuration(){
        org.apache.hadoop.conf.Configuration conf = HBaseConfiguration.create();
        Map<String, String> config = props.getConfig();
        config.forEach(conf::set);
        return conf;
    }

    @Bean
    public Connection getConnection() throws IOException{
        return ConnectionFactory.createConnection(configuration());
    }

    @Bean
    public HBaseAdmin hBaseAdmin() throws IOException {
        return (HBaseAdmin) getConnection().getAdmin();
    }
}

3.1.4 使用API创建表

import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.HBaseAdmin;
import org.apache.hadoop.hbase.io.compress.Compression;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.io.IOException;

/**
 * @author :LiuShihao
 * @date :Created in 2022/6/25 10:13 下午
 * @desc :
 */
@SpringBootTest
@RunWith(SpringRunner.class)
public class HbaseTestDemo {
    //表名
    TableName tableName = TableName.valueOf("phone");

    @Autowired
    HBaseAdmin hBaseAdmin;

    @Test
    public void createTable() throws IOException {
        //在高版本中HTableDescriptor,已经过时了,使用 HTableDescriptorBuilder
        //1.创建表
        HTableDescriptor table = new HTableDescriptor(tableName);
        //2.创建列族
        //在高版本中创建列族使用ColumnFamilyDescriptorBuilder.newBuilder("cf".getBytes())
        table.addFamily(new HColumnDescriptor("cf").setCompressionType(Compression.Algorithm.SNAPPY));
        System.out.print("Creating table. ");
        createOrOverwrite(hBaseAdmin, table);
        System.out.println(" Done.");
    }
    public void createOrOverwrite(Admin admin, HTableDescriptor table) throws IOException {
        if (admin.tableExists(table.getTableName())) {
            admin.disableTable(table.getTableName());
            admin.deleteTable(table.getTableName());
        }
        admin.createTable(table);
    }

}

Mac环境部署单机版Hbase及使用JavaAPI对Hbase增删改查_第17张图片

3.2 连接超时问题

由于使用Docker环境或者是Linux环境部署的Hbase,本地使用IDEA连接总是超时,不知道是什么原因,我尝试了很多种办法都没有解决,所以最后只能子啊本地的Mac环境部署,最后成功连接。
给大家说一下我走的弯路(虽然最终也没有解决):

  1. 使用Docker部署的Hbase,会使用容器ID作为主机映射,所以需要在Linux主机和本地IDEA的主机的hosts文件配置容器ID映射。
  2. 部署单节点的hbase默认注册到zk的主机名是localhost,可以在hbase-site.xml文件中配置:
     <property>
       <name>hbase.zookeeper.quorumname>
       
       <value>主机域名value>
     property>
    

Mac环境部署单机版Hbase及使用JavaAPI对Hbase增删改查_第18张图片

但最后我还是没有解决连接超时的问题。。。最后把hbase部署在了本地连接。
Mac环境部署单机版Hbase及使用JavaAPI对Hbase增删改查_第19张图片
Mac环境部署单机版Hbase及使用JavaAPI对Hbase增删改查_第20张图片

你可能感兴趣的:(大数据,hbase,hadoop,大数据)