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 可存储多个版本(基于时间戳)。

示例数据模型

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 数据写入流程

  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)

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 设计避免热点(如加盐、哈希)。
    • 合理设置列族和版本数。

学习资源