hbase

HBase 的数据模型是怎样的?

一、核心概念概览

HBase 的数据模型是一个稀疏的、分布式的、多维排序表(Sparse, Distributed, Multidimensional, Sorted Map)

从结构上看:

Table → Row → Column Family → Column Qualifier → Timestamp → Value

可理解为一个五维键值映射:

{Table, RowKey, ColumnFamily, ColumnQualifier, Timestamp} → Value

二、主要组成部分

1. Table(表)

  • 类似关系型数据库中的表,但没有固定的 schema(列定义)
  • 不同的表可以存放不同结构的数据。
  • 表由多行(Row)组成,每行通过 RowKey 唯一标识。

2. Row(行)

  • 每一行有一个RowKey,按字典序(lexicographical order)排序。
  • 同一个表中行的 RowKey 是唯一的。
  • RowKey 是 HBase 查询的核心,所有查询都要基于 RowKey 或 RowKey 的范围。

3. Column Family(列族)

  • 列族是表设计时必须预先定义的部分。
  • 一个表可以有多个列族(Column Family)。
  • 列族是HBase 物理存储的最小单位,同一列族的数据会一起存放在 HFile 中。
  • 每个列族下可以动态增加任意多的列。

例如:

Column Family: info
   ├── name
   ├── age
   └── address

4. Column Qualifier(列限定符)

  • 属于列族下的“具体列名”。
  • 列族名 + 列限定符 共同唯一标识一个列。
  • 列限定符是动态可变的,HBase 不要求事先定义列。

例如:

info:name
info:email
info:phone

5. Timestamp(时间戳)

  • 每个单元格(Cell)都有多个版本的值,用时间戳区分
  • 默认使用系统时间(milliseconds)作为时间戳,也可自定义。
  • 可通过列族配置保留版本数(VERSIONS),例如只保留最新的 3 个版本。

6.type

Type 值 含义
Put 普通写入(插入/更新)
Delete 删除单个版本
DeleteColumn 删除整列所有版本
DeleteFamily 删除整个列族所有版本

删除在 HBase 中其实是写入一个带 Delete 标记的 Cell,真正清理发生在 Major Compaction 时。


6. Cell(单元格)

  • Cell 是最小的数据存储单元。
  • {RowKey, ColumnFamily, ColumnQualifier, Timestamp} 唯一确定。
  • 存储实际的 Value

三、数据模型示意

RowKey info:name info:email score:math score:english
001 Alice a@xx.com 90 85
002 Bob b@xx.com 78 92

其中:

  • 表名:students
  • 列族:info, score
  • 列限定符:name, email, math, english

四、模型特性

特性 说明
稀疏性 不存在的列不占存储空间(非常适合非结构化数据)
多版本 每个单元格可保留多个版本的值
排序性 行按照 RowKey 排序存储
分布式 按 RowKey 范围自动分区(Region)并分布在集群中
列式存储 同一列族的数据物理上存放在一起,便于按列访问

五、RowKey 设计建议

RowKey 是 HBase 性能的关键,应避免热点问题:

  • 不要使用自增 ID(容易导致 Region 热点)。

  • 可使用 Hash 前缀、反转字符串、时间戳倒序 等策略。

  • 例:userID_hash_timestamp

  • 例:reverse(phoneNumber)


小结

层级 作用 特点
Table 存储数据的逻辑集合 无固定 schema
Row 按 RowKey 唯一标识 有序
Column Family 存储逻辑分组 需预定义
Column Qualifier 具体列名 可动态增加
Timestamp 区分版本 支持多版本
Value 实际数据 存储内容

Cell 存储示意图

Table
 └── RowKey: user1
       ├── ColumnFamily: info
       │      ├── Column: name
       │      │      ├── [ts=1730600000000] -> "Alice"    ← Cell 1
       │      │      └── [ts=1730500000000] -> "Alicia"   ← Cell 2
       │      └── Column: age
       │             └── [ts=1730600000000] -> "20"       ← Cell 3

在 HBase 中,Store 是 Region 内部的一个核心组件,用于管理某一列族(Column Family)的所有数据(包括内存中的数据和磁盘上的文件)。它是 HBase 数据存储的基本单元,与列族一一对应,承担着数据缓存、持久化和合并等关键工作。

一、Store 的核心组成

每个 Store 由两部分组成,共同管理一个列族的数据:

  1. MemStore(内存缓冲区)

    • 数据写入时的临时存储区域,位于内存中。客户端写入的数据会先进入对应列族的 MemStore,积累到一定大小(默认 128MB,可配置)后,会被异步刷写到磁盘,形成 HFile。
    • 作用:利用内存的高速读写特性,提升数据写入性能(避免频繁写磁盘)。
  2. StoreFile(磁盘文件集合)

    • MemStore 刷写后生成的磁盘文件称为 HFile(HBase 底层存储格式),多个 HFile 组成 StoreFile。
    • 作用:持久化存储数据,所有 HFile 都存储在 HDFS 上,借助 HDFS 的多副本机制保证可靠性。

二、Store 与其他组件的关系

  • 与 Region 的关系:一个 Region 包含多个 Store,每个 Store 对应表中的一个列族。例如,若表 user 有两个列族 infoaddress,则该表的每个 Region 中会有两个 Store(info 列族的 Store 和 address 列族的 Store)。
  • 与列族的关系:Store 是列族的“物理载体”。HBase 中列族是数据存储的逻辑划分,而 Store 是其对应的物理存储单元(包含该列族的所有数据版本和操作记录)。

三、Store 的核心工作机制

  1. 数据写入流程
    当客户端写入数据到某一列族时:

    • 数据先被写入该列族对应的 MemStore(同时写入 HLog 保证可靠性)。
    • 当 MemStore 达到阈值(或满足其他触发条件,如定时、内存紧张),会触发 刷写(Flush),将数据写入磁盘形成 HFile,加入 StoreFile 集合。
  2. 数据读取流程
    读取某一列族的数据时:

    • 先检查 MemStore 中是否有目标数据(内存读取速度快)。
    • 若未找到,再扫描 StoreFile(HFile)中的数据(磁盘读取)。
    • 最终合并 MemStore 和 StoreFile 的结果,返回给客户端。
  3. 文件合并(Compaction)
    随着 MemStore 不断刷写,StoreFile 会产生大量小文件,影响读取效率。Store 会通过两种合并机制优化文件结构:

    • Minor Compaction:将多个小 HFile 合并为一个较大的 HFile,过程中不删除过期数据(如 TTL 过期、版本数超过限制的数据)。
    • Major Compaction:将一个 Store 中所有 HFile 合并为一个大 HFile,同时删除过期数据和标记删除的数据(彻底清理无效数据)。

四、总结

Store 是 HBase 中列族的物理存储单元,每个列族对应一个 Store,内部通过 MemStore(内存缓存)和 StoreFile(磁盘文件)管理数据的读写和持久化。其核心作用是:

  • 利用 MemStore 提升写入性能;
  • 通过 HFile 实现数据持久化;
  • 借助 Compaction 优化存储结构,保证读取效率。

理解 Store 的工作机制,有助于优化 HBase 表设计(如合理规划列族数量)和性能调优(如调整 MemStore 大小、Compaction 策略)。

posted @ 2025-11-03 22:17  不报异常的空指针  阅读(20)  评论(0)    收藏  举报