当前位置: 首页 > news >正文

HBase 详解

1. HBase 简介

HBase 是一个开源的 分布式、可扩展的列式 NoSQL 数据库,基于 Google BigTable 设计,运行在 HDFS(Hadoop 分布式文件系统) 之上。它适合存储 海量结构化或半结构化数据,并提供 低延迟随机读写 能力。

核心特点

  • 列式存储:数据按列族(Column Family)存储,适合稀疏数据。
  • 强一致性:单行操作是原子的(ACID)。
  • 水平扩展:通过 RegionServer 自动分片(Sharding)。
  • 高吞吐量:适合大数据场景(如日志、用户行为数据)。
  • 与 Hadoop 生态集成:支持 MapReduce、Spark、Hive 等。

2. HBase 数据模型

HBase 的数据模型不同于关系型数据库,采用 多维映射表 结构:

概念说明
Table(表)存储数据的集合,由多行组成。
Row(行)每行由 RowKey 唯一标识,按字典序排序。
Column Family(列族)列的逻辑分组,存储在一起(如 cf:name, cf:age)。
Column Qualifier(列限定符)列族下的具体列(如 cf:name 中的 name)。
Cell(单元格)存储具体值,包含 RowKey + Column Family + Column Qualifier + Timestamp
Version(版本)每个 Cell 可存储多个版本(基于时间戳)。

示例数据模型

RowKeyColumn Family cf1Column Family cf2
user1cf1:name=Alice, cf1:age=25cf2:city=Beijing
user2cf1:name=Bob, cf1:age=30cf2:city=Shanghai

3. HBase 架构

3.1 核心组件

组件说明
HMaster管理元数据(表结构、Region 分配),负责负载均衡。
RegionServer存储实际数据,处理读写请求。
Region表的水平分片(按 RowKey 范围划分)。
ZooKeeper协调集群状态,管理 HMaster 选举。
HDFS底层存储,保证数据持久化和高可用。

3.2 数据写入流程

  1. 客户端向 ZooKeeper 获取 hbase:meta 表位置。
  2. 查询 hbase:meta 找到目标 RegionServer。
  3. 数据先写入 WAL(Write-Ahead Log) 保证持久化。
  4. 写入 MemStore(内存),达到阈值后刷入 HFile(磁盘)

3.3 数据读取流程

  1. 客户端定位到目标 RegionServer。
  2. 先查 BlockCache(读缓存),未命中则查 MemStore + HFile
  3. 合并多个版本的数据(按时间戳返回最新值)。

4. HBase Java API 常用操作

4.1 环境配置(Maven)

<dependency><groupId>org.apache.hbase</groupId><artifactId>hbase-client</artifactId><version>2.4.11</version>
</dependency>

4.2 基本操作示例

(1) 创建连接
Configuration config = HBaseConfiguration.create();
config.set("hbase.zookeeper.quorum", "localhost"); // ZK 地址
try (Connection connection = ConnectionFactory.createConnection(config)) {// 操作代码...
}
(2) 创建表
Admin admin = connection.getAdmin();
TableName tableName = TableName.valueOf("users");
TableDescriptorBuilder tableDesc = TableDescriptorBuilder.newBuilder(tableName);
ColumnFamilyDescriptorBuilder cfDesc = ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes("cf1"));
tableDesc.setColumnFamily(cfDesc.build());
admin.createTable(tableDesc.build());
(3) 插入数据
Table table = connection.getTable(tableName);
Put put = new Put(Bytes.toBytes("user1")); // RowKey
put.addColumn(Bytes.toBytes("cf1"), Bytes.toBytes("name"), Bytes.toBytes("Alice"));
put.addColumn(Bytes.toBytes("cf1"), Bytes.toBytes("age"), Bytes.toBytes("25"));
table.put(put);
(4) 查询数据
Get get = new Get(Bytes.toBytes("user1"));
Result result = table.get(get);
byte[] name = result.getValue(Bytes.toBytes("cf1"), Bytes.toBytes("name"));
System.out.println("Name: " + Bytes.toString(name));
(5) 扫描数据
Scan scan = new Scan();
scan.addFamily(Bytes.toBytes("cf1")); // 指定列族
try (ResultScanner scanner = table.getScanner(scan)) {for (Result res : scanner) {String rowKey = Bytes.toString(res.getRow());String name = Bytes.toString(res.getValue(Bytes.toBytes("cf1"), Bytes.toBytes("name")));System.out.println(rowKey + ": " + name);}
}
(6) 删除数据
Delete delete = new Delete(Bytes.toBytes("user1"));
delete.addColumn(Bytes.toBytes("cf1"), Bytes.toBytes("age"));
table.delete(delete);

5. HBase 适用场景

适合场景

海量数据存储(TB/PB 级)
高并发随机读写(如用户画像、实时查询)
时间序列数据(如日志、传感器数据)
稀疏数据(灵活的动态列)

不适合场景

复杂事务(仅支持单行事务)
多表关联查询(需配合 Phoenix 或 Hive)
低延迟 OLTP(不如 Redis/Cassandra)


6. HBase vs. 其他数据库

特性HBaseCassandraBigtableMongoDB
数据模型宽列存储宽列存储宽列存储文档存储
一致性强一致最终一致强一致可调
扩展性依赖 HDFS去中心化Google Cloud分片集群
查询语言Scan/GetCQL自定义 APIMongoDB Query
典型场景大数据分析高写入Google 生态灵活 JSON

7. 总结

  • HBase 是 Hadoop 生态的列式数据库,适合海量数据存储和高并发访问。
  • Java API 提供 Put/Get/Scan/Delete 等操作,开发需关注 RowKey 设计。
  • 适用场景:用户行为日志、时间序列数据、实时查询系统。
  • 优化建议
    • RowKey 设计避免热点(如加盐、哈希)。
    • 合理设置列族和版本数。

学习资源

  • 官方文档:https://hbase.apache.org/
  • 《HBase in Action》(Manning)
http://www.dtcms.com/a/304726.html

相关文章:

  • 使用jQuery时的注意事项
  • Java 大视界 -- Java 大数据机器学习模型在金融信用评级模型优化与信用风险动态管理中的应用(371)
  • 每日学习笔记记录(分享更新版-凌乱)
  • 亚马逊欧洲站流量破局:多维策略重构与运营效能升级
  • 社区版 2025.7 | CQ-Mate V1.3发布啦!
  • python线性回归:从原理到实战应用
  • 广告投放平台:从痛点解决到高效管理的全解析
  • 数据库02 网页html01 day44
  • 浅析MCP (1)+ 【小智 AI 机器人MCP案例分析】
  • Python的垃圾回收机制
  • PyTorch 数据类型和使用
  • 【C++算法】72.队列+宽搜_二叉树的最大宽度
  • Qt 多线程数据库操作优化
  • 图像认知与OpenCV | Day5:图像预处理(4)
  • 关于 Apache Ignite 中 Job 调度(Job Scheduling)与冲突控制(Collision Control) 的机制说明
  • 嵌入式中间件-uorb解析
  • GC8870刷式直流电机驱动器详解:3.6A高功率PWM控制芯片
  • 中间件二进制部署文档
  • java导出pdf(使用html)
  • kotlin StateFlow的两个问题和使用场景探讨
  • Coze Studio概览(三)--智能体管理
  • 虚拟机网络修复
  • centos服务器安装minio
  • ./build.sh:行1: g++: 未找到命令的错误问题在centos操作系统下面如何解决
  • C# SerialPort和ISerialServer的区别
  • 编程算法在金融、医疗、教育、制造业等领域的落地案例
  • 【nerf处理视频数据】Instant-NGP项目NeRF模型训练数据集准备指南
  • Sentinel实现限流和熔断降级
  • 基于YOLOP与GAN的图像修复与防御系统设计与实现
  • sqli-labs通关笔记-第24关 SQL二次注入(单引号闭合)