倾情奉献 ,HBase 快速入门手册 - Java

👈👈👈 欢迎点赞收藏关注哟

首先分享之前的所有文章 >>>> 😜😜😜
文章合集 : 🎁 juejin.cn/post/694164...
Github : 👉 github.com/black-ant
CASE 备份 : 👉 gitee.com/antblack/ca...

一. 前言

之前 Hadoop 入门 时讲过 , Hadoop 本身属于底层框架,在其上层有很多功能上的实现 ,并且这些实现都取得了不错的成绩。

HBase 就是其中一个, HBase 是一个列数据库, 其核心是基于 Hadoop 来实现的。

  • 文章内容概述
    • HBase 概念宏观一览
    • HBase 快速部署
    • HBase Java 调用案例

二. HBase 简述

2.1 HBase 特性快读

  • HBase 依赖于 Hadoop 存储数据 ,可以认为 HBase 的数据是存储在 HDFS
  • HBase 是一个列式数据
  • HBase 并不快,只是在数据量较大的,性能衰减要比其他数据库小的多 @ HBase不睡觉书
  • HBase 本身不支持连表查询 , 写 GroupByOrder By 会很麻烦

2.2 HBase 适用场景

  • 单表超千万 ,并发很高
  • 不需要复杂的数据分析,实时性要求不高

2.3 HBase 部署架构

  • HBase有两种服务器:Master服务器RegionServer服务器
  • 一个集群通常有一个 Master 服务器 和 多个 RegionServer服务器
  • Master 用于维护表结构关系 ,RegionServer 负责存储数据
  • HBase 基于 ZooKeeper 管理 RegionServer 信息

补充知识点 : Master 的主要功能

  • 为 RegionServer 分配 Region
  • 负责 RegionServer 的负载均衡
  • 发现失效的 RegionServer 并重新分配其上的 Region
  • HDFS 上的垃圾文件(HBase)回收
  • 处理 Schema 更新请求(表的创建,删除,修改,列簇的增加等等)

RegionServer 和 Region 的关系

  • RegionServer 存储和处理数据,它负责存储一个或多个 Region
  • Region 是 HBase 中的存储和管理数据的单位
  • 一个 RegionServer 可以存储多个 Region
  • 一个 Region 只属于一个 RegionServer
  • RegionServer 负责管理其托管的 Region 的所有读写操作
  • RegionServer 会定期将 Region 的数据刷新到 HDFS 上

2.4 HBase 的存储结构

  • 基本单元是列 (Column
  • 一个列或者多个列形成一行 (Raw
    • HBase 中每一行的列可以完全不同 (即行列并不是严格对齐
  • 每一行都有一个唯一的行键 (rowKey
  • 每个列又存在多个版本 , 多个版本的值存储在单元格中 (Cell
  • Hbase 中若干的列可以组成列族(columnFamily

补充知识点 :

  • 📍补充知识RowKey
    • RowKey 是由用户指定的一串不重复的字符串
    • RowKey 是HBase 唯一的排序字段
    • 当使用相同的 RowKey 时,会覆盖之前的数据,而之前的数据可以通过版本号访问
  • 📍补充知识版本号
    • HBase 当更新数据的时候,并不会导致数据直接消失
    • HBase 可以通过版本号访问之前的数据
  • 📍补充知识点单元格
    • 唯一确定一条结果的表达式应该是行键:列族:列:版本号
    • 一个列上可以存储多个版本的值 , 这些值被放在不同的单元格中
  • 📍补充知识列族 (ColumnFamily的概念)
    • 表的一些通用数据可以定义在列族上 , 因为列是可变的 ,而一个列族内的所有列都会有相同的属性
    • HBase 一个列名称的前面总是带有所属的列族 (brother:age)
    • HBase 会把相同列族的列尽量放在同一台机器上
    • Hbase 的列族不是越多越好,官方推荐的是列族最好小于或者等于3
    • Hbase 表的创建的时候就必须指定列族
  • 📍补充知识Region
    • 一个 Region 是多个行的集合

2.5 阶段总结

关于 HBase 的基础就这么多 ,再多反而会影响学习的效果。

三. 快速安装

由于主要是学习,所以这里不会采用生产级的部署方式,采取 Docker 快速安装的方法。

java 复制代码
// S1 : 拉取镜像
docker pull harisekhon/hbase:latest

// S2 : 启动 Docker
docker run -d -h docker-hbase \
        -p 2181:2181 \
        -p 8080:8080 \
        -p 8085:8085 \
        -p 9090:9090 \
        -p 9000:9000 \
        -p 9095:9095 \
        -p 16000:16000 \
        -p 16010:16010 \
        -p 16201:16201 \
        -p 16301:16301 \
        -p 16020:16020\
        --name hbase \
        harisekhon/hbase

// S3 : 进入容器 base 页面
docker exec -it <容器ID> bash

// S4 : 创建数据库(其他命令这一篇就不细看了)
hbase shell
create 'test','f'

// 进入图形界面
http://11.97.45.123:16010/master-status

Zookeeper 中的数据

HBase Master 管理页面

四. Java 调用方式

4.1 Maven 依赖

java 复制代码
<dependency>
    <groupId>org.apache.hbase</groupId>
    <artifactId>hbase-client</artifactId>
    <version>2.4.10</version>
</dependency>

4.2 基础操作

java 复制代码
// 此处 default.com 是我 HOST 映射到服务器IP上
public static Connection buildConnect() throws Exception {
        // 创建 HBase 配置
        Configuration configuration = HBaseConfiguration.create();
        configuration.set("hbase.zookeeper.quorum", "default.com:2181");
        configuration.set("zookeeper.znode.parent", "/hbase");
        configuration.set("hbase.zookeeper.property.clientPort", "2181");
        configuration.set("hbase.zookeeper.property.connectionString", "default.com:2181");
        // 创建 HBase 客户端连接
        return ConnectionFactory.createConnection(configuration);
}

全操作生命周期

java 复制代码
private void testDemo() throws Exception {
        Connection connection = buildConnect();

        // 获取表
        TableName tableName = TableName.valueOf("testtable");
        Table table = connection.getTable(tableName);

        // Put 数据
        Put put = new Put("row1".getBytes());
        put.addColumn("cf1".getBytes(), "col1".getBytes(), "value1".getBytes());
        table.put(put);
        log.info("数据插入完成");

        // Get 数据
        Get get = new Get("row1".getBytes());
        Result result = table.get(get);
        byte[] value = result.getValue("cf1".getBytes(), "col1".getBytes());
        log.info("获取到数据:{}", value);

        // Close 连接
        table.close();
        connection.close();
}

校验并且创建表

java 复制代码
Connection connection = HbaseConnectionUtil.buildConnect();

// S1 : 查询表是否存在
HBaseAdmin admin = (HBaseAdmin) connection.getAdmin();
if (!admin.tableExists(TableName.valueOf(tableNameStr))) {
    log.info("table 表不存在,对表进行创建");
    // S2 : 如果表不存在,创建表
    TableDescriptorBuilder builder = TableDescriptorBuilder.newBuilder(TableName.valueOf(tableNameStr));
    // 添加列族 (创建表的时候必须添加列族)
    builder.setColumnFamily(ColumnFamilyDescriptorBuilder.newBuilder("user".getBytes()).build());
    builder.setColumnFamily(ColumnFamilyDescriptorBuilder.newBuilder("address".getBytes()).build());
    // 创建表
    admin.createTable(builder.build());
    System.out.println("Table " + tableNameStr + " created successfully.");
}

4.3 特定功能

插入数据

java 复制代码
private void createRowMany(Table table) throws Exception {
        String rowKey = "Row" + UUID.randomUUID();
        Put put = new Put(rowKey.getBytes());
        String valueUser = "AntBlack" + new Random().nextInt(99999);
        put.addColumn("user".getBytes(), "name".getBytes(), valueUser.getBytes());
        String valueAddress = "ShangHai" + new Random().nextInt(99999);
        put.addColumn("address".getBytes(), "info".getBytes(), valueAddress.getBytes());
        table.put(put);
}

单条数据查询

java 复制代码
    public JSONObject getOne(String rowKeyStr, Table table) throws Exception {
        JSONObject resultJson = new JSONObject();
        // 这里通过 RowKey 进行查询
        byte[] rowKey = Bytes.toBytes(rowKeyStr);
        Get get = new Get(rowKey);
        // 此处定义要查询的列族
        get.addFamily(Bytes.toBytes("address"));
        get.addFamily(Bytes.toBytes("user"));
        try {
            Result result = table.get(get);
            if (result.isEmpty()) {
                System.out.println("No data found for row key: " + Bytes.toString(rowKey));
            } else {
                // 输出行键
                System.out.println("RowKey: " + Bytes.toString(result.getRow()));
                // 遍历并输出所有的单元格数据
                for (Cell cell : result.rawCells()) {
                    String family = Bytes.toString(CellUtil.cloneFamily(cell));
                    String qualifier = Bytes.toString(CellUtil.cloneQualifier(cell));
                    String value = Bytes.toString(CellUtil.cloneValue(cell));
                    resultJson.put(family + ":" + qualifier, value);
                }
            }
        } catch (Exception e) {
            log.info("查询异常");
        }
        return resultJson;
    }

全表扫描

java 复制代码
public List<JSONObject> scanAllData(Table table) throws IOException {
        // 创建扫描器
        Scan scan = new Scan();
        scan.addFamily(Bytes.toBytes("user"));
        scan.addFamily(Bytes.toBytes("address"));

        // 扫描表中的所有数据
        ResultScanner scanner = table.getScanner(scan);

        // 迭代结果
        List<JSONObject> resultList = new ArrayList<>();
        for (Result result : scanner) {
            // 获取行键
            byte[] rowKey = result.getRow();

            // 获取列族和列名
            JSONObject resultJson = new JSONObject();
            for (Cell cell : result.rawCells()) {
                String family = Bytes.toString(CellUtil.cloneFamily(cell));
                String qualifier = Bytes.toString(CellUtil.cloneQualifier(cell));
                String value = Bytes.toString(CellUtil.cloneValue(cell));
                resultJson.put(family + ":" + qualifier, value);
            }
            resultList.add(resultJson);
        }

        // 关闭扫描器
        scanner.close();
        return resultList;
}

总结

这一篇就写到这里了,入门篇不涉及到复杂查询方式,但是后续文档会深入这一块。

参考 :

相关推荐
智慧物业老杨4 小时前
物业数字化落地思考:真正的转型,是底层数据秩序的重构
java·大数据·人工智能·微服务·系统架构
上进小菜猪6 小时前
把 KES 集群交给 Kubernetes 的九十天:一个 DBA 的试用实录
后端
两点王爷7 小时前
PostgreSQL 常用 SQL 语句与 GIS 相关函数详解
数据库·后端
考虑考虑8 小时前
Springboot环境变量占位符语法
spring boot·后端·spring
RoboWizard8 小时前
三星和金士顿内存条哪个更适合游戏超频
大数据·人工智能
深圳市恒星物联科技有限公司9 小时前
轻量MCU设备通过OpenHarmony兼容性测评的全流程关键要点与实战踩坑经验
大数据·人工智能·物联网·鸿蒙
TDengine (老段)9 小时前
TDengine 常见问题 TOP3
大数据·数据库·物联网·时序数据库·tdengine·涛思数据
步行cgn9 小时前
Spring 基于 XML 的自动装配:byName 详解
java·后端·spring
Alice-YUE10 小时前
工业级 AI Agent 架构:5 层、2 范式、4 原则,一次讲透
面试·系统架构·大模型·ai agent·智能体
Leo.yuan11 小时前
盘点2026十大主流国产数据仓库软件:从开源到商业,企业级怎么选?
大数据