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 可存储多个版本(基于时间戳)。 |
示例数据模型
RowKey | Column Family cf1 |
Column Family cf2 |
---|---|---|
user1 |
cf1:name=Alice , cf1:age=25 |
cf2:city=Beijing |
user2 |
cf1:name=Bob , cf1:age=30 |
cf2:city=Shanghai |
3. HBase 架构
3.1 核心组件
组件 | 说明 |
---|---|
HMaster | 管理元数据(表结构、Region 分配),负责负载均衡。 |
RegionServer | 存储实际数据,处理读写请求。 |
Region | 表的水平分片(按 RowKey 范围划分)。 |
ZooKeeper | 协调集群状态,管理 HMaster 选举。 |
HDFS | 底层存储,保证数据持久化和高可用。 |
3.2 数据写入流程
- 客户端向 ZooKeeper 获取
hbase:meta
表位置。 - 查询
hbase:meta
找到目标 RegionServer。 - 数据先写入 WAL(Write-Ahead Log) 保证持久化。
- 写入 MemStore(内存) ,达到阈值后刷入 HFile(磁盘)。
3.3 数据读取流程
- 客户端定位到目标 RegionServer。
- 先查 BlockCache(读缓存) ,未命中则查 MemStore + HFile。
- 合并多个版本的数据(按时间戳返回最新值)。
4. HBase Java API 常用操作
4.1 环境配置(Maven)
xml
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-client</artifactId>
<version>2.4.11</version>
</dependency>
4.2 基本操作示例
(1) 创建连接
java
Configuration config = HBaseConfiguration.create();
config.set("hbase.zookeeper.quorum", "localhost"); // ZK 地址
try (Connection connection = ConnectionFactory.createConnection(config)) {
// 操作代码...
}
(2) 创建表
java
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) 插入数据
java
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) 查询数据
java
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) 扫描数据
java
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) 删除数据
java
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. 其他数据库
特性 | HBase | Cassandra | Bigtable | MongoDB |
---|---|---|---|---|
数据模型 | 宽列存储 | 宽列存储 | 宽列存储 | 文档存储 |
一致性 | 强一致 | 最终一致 | 强一致 | 可调 |
扩展性 | 依赖 HDFS | 去中心化 | Google Cloud | 分片集群 |
查询语言 | Scan/Get | CQL | 自定义 API | MongoDB Query |
典型场景 | 大数据分析 | 高写入 | Google 生态 | 灵活 JSON |
7. 总结
- HBase 是 Hadoop 生态的列式数据库,适合海量数据存储和高并发访问。
- Java API 提供 Put/Get/Scan/Delete 等操作,开发需关注 RowKey 设计。
- 适用场景:用户行为日志、时间序列数据、实时查询系统。
- 优化建议 :
- RowKey 设计避免热点(如加盐、哈希)。
- 合理设置列族和版本数。
学习资源
- 官方文档:https://hbase.apache.org/
- 《HBase in Action》(Manning)