之前对列式存储接触的不太多, 我想从 hbase 入手, 学习一下列式数据库的基本原理和存储结构;

逻辑结构

hbase 不是传统的列式存储结构, 而是按列族聚合的存储结构;

hbase 表的行结构:

1
2
# 按照 rowkey 的字典序升序排列
(rowkey, columnFamily, column) -> (value, timestamp)

1
SortedMap<RowKey, List<SortedMap<Column, List<value, Timestamp>>>>

详细示例

逻辑数据

RowKey name age email phone last_login login_count
user001 张三 28 [email protected] 13800138001 10:30:00 42
user002 李四 32 [email protected] 13900139002 14:15:00 27

表结构

列族定义:

  • basic_info (基本信息)
    • 列: name, age
  • contact_info (联系信息)
    • 列: email, phone
  • activity_info (活动信息)
    • 列: last_login, login_count

建表语句:

1
create 'my_table', {NAME => 'basic_info', VERSIONS => 1}, {NAME => 'contact_info', VERSIONS => 1}, {NAME => 'activity_info', VERSIONS => 1}

物理存储的逻辑结构

hbase 在磁盘上会按列族分开存储, 每个列族对应一个独立的存储文件 (HFile), 以下是实际存储的逻辑视图:

  • 列族 basic_info 的存储文件

    1
    2
    3
    4
    5
    6
    RowKey    | Column Qualifier | Timestamp     | Value
    ----------|------------------|---------------|---------
    user001 | name | 1692066600000 | 张三
    user001 | age | 1692066600000 | 28
    user002 | name | 1692159300000 | 李四
    user002 | age | 1692159300000 | 32
  • 列族 contact_info 的存储文件

    1
    2
    3
    4
    5
    6
    RowKey    | Column Qualifier | Timestamp     | Value
    ----------|------------------|---------------|-----------------------
    user001 | email | 1692066600000 | [email protected]
    user001 | phone | 1692066600000 | 13800138001
    user002 | email | 1692159300000 | [email protected]
    user002 | phone | 1692159300000 | 13900139002
  • 列族 activity_info 的存储文件

    1
    2
    3
    4
    5
    6
    RowKey    | Column Qualifier | Timestamp     | Value
    ----------|------------------|---------------|-----------------------
    user001 | last_login | 1692066600000 | 10:30:00
    user001 | login_count | 1692066600000 | 42
    user002 | last_login | 1692159300000 | 14:15:00
    user002 | login_count | 1692159300000 | 27

参考资料