• 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/

    在这里插入图片描述

    部署的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
    
    • 1
    • 2
    • 3
    • 4

    docker容器运行后,直接在浏览器访问16010端口:
    在这里插入图片描述
    Hbase部署成功了。

    2.2 Linux环境部署

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

    1. 配置 hbase-env.sh 脚本中的Java环境变量
      在这里插入图片描述
      在这里插入图片描述
    2. 修改hbase-site.xml配置
    <configuration>
      <property>
        <name>hbase.rootdir</name>
        <value>file:///home/testuser/hbase</value>
      </property>
      <property>
        <name>hbase.zookeeper.property.dataDir</name>
        <value>/home/testuser/zookeeper</value>
      </property>
      <property>  
        <name>hbase.table.sanity.checks</name>  
        <value>false</value>  
      </property>  
    </configuration>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述

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

    启动报错了:
    在这里插入图片描述

    解决方法:修改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"
    
    • 1
    • 2

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

    2.3 Mac环境部署

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

    1. 配置 hbase-env.sh 脚本中的Java环境变量,同时需要注释掉HBASE_MASTER_OPTSHBASE_REGIONSERVER_OPTS配置。
      在这里插入图片描述
      在这里插入图片描述

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

    <configuration>
      <property>
        <name>hbase.rootdir</name>
        <value>file:///Users/LiuShihao/hbase/</value>
      </property>
      <property>
        <name>hbase.zookeeper.property.dataDir</name>
        <value>/Users/LiuShihao/zookeeper</value>
      </property>
      <property>  
        <name>hbase.table.sanity.checks</name>  
        <value>false</value>  
      </property>  
    </configuration>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    1. 配置环境变量 略

    在这里插入图片描述

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    在这里插入图片描述

    2.4.1 创建表

    # 表名first ,一个列族 cf1
    create 'first','cf1'
    # 表名second ,三个列族 cf1,cf2,cf3
    create 'second','cf1','cf2','cf3'
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    2.4.2 插入数据

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

    在这里插入图片描述

    2.4.3 删除表

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

    在这里插入图片描述

    2.4.4 异写数据到磁盘

    在这里插入图片描述
    /hbase-data/data/default/test/ac13d86e488d18593ca5f3c86db42287/cf目录下查看:
    在这里插入图片描述
    在这里插入图片描述
    此时发现cf中已经有数据了,是因为默认数据是在内存中,到达64M的时候才会进行异步写入到磁盘中。我们可以使用flush命令手动刷新。
    在这里插入图片描述

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

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

    在这里插入图片描述

    2.5 完全集群式部署: 略

    配置两台服务器免密登录

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

    三、使用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.hbase</groupId>
                <artifactId>hbase-client</artifactId>
                <version>1.2.6</version>
                <exclusions>
                    <exclusion>
                        <groupId>org.slf4j</groupId>
                        <artifactId>slf4j-log4j12</artifactId>
                    </exclusion>
                    <exclusion>
                        <groupId>com.google.guava</groupId>
                        <artifactId>guava</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
            <!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
            <dependency>
                <groupId>com.google.guava</groupId>
                <artifactId>guava</artifactId>
                <version>16.0.1</version>
            </dependency>
            <dependency>
                <groupId>com.google.protobuf</groupId>
                <artifactId>protobuf-java</artifactId>
                <version>2.5.0</version>
            </dependency>
        </dependencies>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    3.1.2 application.yml

    server:
      port: 8099
    hbase:
      config:
        hbase.zookeeper.quorum: localhost
        hbase.zookeeper.port: 2181
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    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;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    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();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44

    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);
        }
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50

    在这里插入图片描述

    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.quorum</name>
         <!-- 注意在hosts文件映射-->
         <value>主机域名</value>
       </property>
      
      • 1
      • 2
      • 3
      • 4
      • 5

    在这里插入图片描述

    但最后我还是没有解决连接超时的问题。。。最后把hbase部署在了本地连接。
    在这里插入图片描述
    在这里插入图片描述

  • 相关阅读:
    SuperMap iClient3D 11i (2023) SP1 for Cesium之移动实体对象
    STM32——SPI通信
    http和https分别是什么?
    【甄选靶场】Vulnhub百个项目渗透——项目十六:FristiLeaks_1.3(文件上传,py脚本改写,sudo提权,脏牛提权,源码获取)
    通义千问:一个专门响应人类指令的大模型
    第一百五十五回 如何获取位置信息
    Python通过下标获取指定的文件并复制到一个新的文件
    20个实用的 TypeScript 单行代码汇总
    [附源码]java毕业设计个人信息管理系统
    读取yml文件
  • 原文地址:https://blog.csdn.net/DreamsArchitects/article/details/125436927