FantasticMao 技术笔记
BlogGitHub
  • README
  • C & Unix
    • C
      • 《C 程序设计语言》笔记
      • C 语言中的陷阱
      • CMake 示例
      • GNU make
      • LLVM Clang
      • Nginx 常用模块
      • Vim 常用命令
    • Unix-like
      • 《深入理解计算机系统》笔记
      • 《UNIX 环境高级编程》笔记 - UNIX 基础知识
      • 《UNIX 环境高级编程》笔记 - 文件 IO
      • 《UNIX 环境高级编程》笔记 - 标准 IO 库
      • 《鳥哥的 Linux 私房菜》笔记 - 目录配置
      • 《鳥哥的 Linux 私房菜》笔记 - 认识与学习 bash
      • 《鳥哥的 Linux 私房菜》笔记 - 任务管理
      • OpenWrt 中的陷阱
      • iptables 工作机制
  • Go
    • 《A Tour of Go》笔记
    • Go vs C vsJava
    • Go 常用命令
    • Go 语言中的陷阱
  • Java
    • JDK
      • 《Java 并发编程实战》笔记 - 线程池的使用
      • 设计模式概览
      • 集合概览
      • HashMap 内部算法
      • ThreadLocal 工作机制
      • Java Agent
    • JVM
      • 《深入理解 Java 虚拟机》笔记 - Java 内存模型与线程
      • JVM 运行时数据区
      • 类加载机制
      • 垃圾回收算法
      • 引用类型
      • 垃圾收集算法
      • 垃圾收集器
    • Spring
      • Spring IoC 容器扩展点
      • Spring Transaction 声明式事务管理
      • Spring Web MVC DispatcherServlet 工作机制
      • Spring Security Servlet 实现原理
    • 其它
      • 《Netty - One Framework to rule them all》演讲笔记
      • Hystrix 设计与实现
  • JavaScript
    • 《写给大家看的设计书》笔记 - 设计原则
    • 《JavaScript 权威指南》笔记 - jQuery 类库
  • 数据库
    • ElasticSearch
      • ElasticSearch 概览
    • HBase
      • HBase 数据模型
    • Prometheus
      • Prometheus 概览
      • Prometheus 数据模型和指标类型
      • Prometheus 查询语法
      • Prometheus 存储原理
      • Prometheus vs InfluxDB
    • Redis
      • 《Redis 设计与实现》笔记 - 简单动态字符串
      • 《Redis 设计与实现》笔记 - 链表
      • 《Redis 设计与实现》笔记 - 字典
      • 《Redis 设计与实现》笔记 - 跳跃表
      • 《Redis 设计与实现》笔记 - 整数集合
      • 《Redis 设计与实现》笔记 - 压缩列表
      • 《Redis 设计与实现》笔记 - 对象
      • Redis 内存回收策略
      • Redis 实现分布式锁
      • Redis 持久化机制
      • Redis 数据分片方案
      • 使用缓存的常见问题
    • MySQL
      • 《高性能 MySQL》笔记 - Schema 与数据类型优化
      • 《高性能 MySQL》笔记 - 创建高性能的索引
      • 《MySQL Reference Manual》笔记 - InnoDB 和 ACID 模型
      • 《MySQL Reference Manual》笔记 - InnoDB 多版本
      • 《MySQL Reference Manual》笔记 - InnoDB 锁
      • 《MySQL Reference Manual》笔记 - InnoDB 事务模型
      • B-Tree 简述
      • 理解查询执行计划
  • 中间件
    • gRPC
      • gRPC 负载均衡
    • ZooKeeper
      • ZooKeeper 数据模型
    • 消息队列
      • 消息积压解决策略
      • RocketMQ 架构设计
      • RocketMQ 功能特性
      • RocketMQ 消息存储
  • 分布式系统
    • 《凤凰架构》笔记
    • 系统设计思路
    • 系统优化思路
    • 分布式事务协议:二阶段提交和三阶段提交
    • 分布式系统的技术栈
    • 分布式系统的弹性设计
    • 单点登录解决方案
    • 容错,高可用和灾备
  • 数据结构和算法
    • 一致性哈希
    • 布隆过滤器
    • 散列表
  • 网络协议
    • 诊断工具
    • TCP 协议
      • TCP 报文结构
      • TCP 连接管理
由 GitBook 提供支持
在本页
  • 概念视图
  • 物理视图
  1. 数据库
  2. HBase

HBase 数据模型

在 HBase 中,数据被存储在表中,表中有行和列。这与关系型数据库中的术语相似,但不是一个恰当的比喻。相反,将 HBase 表视为多维度的映射(map)可能更为恰当。

HBase 数据模型术语:

  • 表 Table

    一个 HBase 表由多个行组成。

  • 行 Row

    一个 HBase 行由一个行键(row key)和一个或多个与行键关联的带有值的列组成。行在存储时,按照行键的字母顺序存储。因此,行键的设计十分重要。目的是以相关的行彼此靠近的方式存储数据。

  • 列 Column

    一个 HBase 列由一个列族(column family)和一个列限定符(column qualifier)组成,以 : 冒号分割。

  • 列族 Column Family

    出于性能原因,列族是被设计为在物理上并列存储的一组列和列的值。每个列族都有一组存储属性,例如列的值是否应该被缓存在内存中,数据如何被压缩,行键如何被编码等。

    表中的每行都有相同的列族,尽管某些行可能不会在某些列族中存储任何数据。

  • 列限定符 Column Qualifier

    列限定符是被添加到列族上的,为一组数据提供的索引。对于一个给定的列族 content,列限定符可以是 content:html 或者 content:pdf。

    列族在表创建时就固定不变,列限定符是动态可变的,并且不同行之间的列限定符可能会有很大的差异。

  • 单元格 Cell

    单元格式行、列族、列限定符和组合,并且还包含了一个值和一个时间戳,表示值的版本。

  • 时间戳 Timestamp

    每个值写入的时候都会附带一个时间戳,它是一个值的版本的标志符。

    默认情况下,时间戳表示写入数据时 RegionServer 上的时间,但也可以在将数据写入单元格时指定不同的时间戳。

概念视图

这是一张叫 webtable 的表,包含了两个行(com.cnn.www、com.example.www)和三个列族(contents、anchor、people)。

在这个示例中,对于第一个行 com.cnn.www,anchor 列族包含了两个列(anchor:cnnsi.com、anchor:my.look.ca),contents 列族包含了一个列(contents:html)。

这个示例包含 com.cnn.www 行键的 5 个版本,com.example.www 行键的 1 个版本。

Row Key

Timestamp

Column Family contents

Column Family anchor

Column Family people

"com.cnn.www"

t9

anchor:cnnsi.com="CNN"

"com.cnn.www"

t8

anchor:my.look.ca="CNN.com"

"com.cnn.www"

t6

contents:html="<html>..."

"com.cnn.www"

t5

contents:html="<html>..."

"com.cnn.www"

t3

contents:html="<html>..."

"com.example.www"

t5

contents:html="<html>..."

people:author="John Doe"

在 HBase 中,表中为空的单元格不占用存储空间,实际上也并不存在。这是 HBase 表「稀疏」的原因。

下面通过一个多维度的映射结构,表示了与 webtable 表相同的信息。

{
  "com.cnn.www": {
    "contents": {
      "t6": {
        "contents:html": "<html>..."
      },
      "t5": {
        "contents:html": "<html>..."
      },
      "t3": {
        "contents:html": "<html>..."
      }
    },
    "anchor": {
      "t9": {
        "anchor:cnnsi.com": "CNN"
      },
      "t8": {
        "anchor:my.look.ca": "CNN.com"
      }
    },
    "people": {
    }
  },
  "com.example.www": {
    "contents": {
      "t5": {
        "contents:html": "<html>.."
      }
    },
    "anchor": {
    },
    "people": {
      "t5": {
        "people:author": "John Dor"
      }
    }
  }
}

物理视图

虽然在概念层面上的表可能被视为一组稀疏的行,但在物理层面上的表是由列族来存储的。

一个新的列限定符(column_family:column_qualifier)可以随时被添加到已经存在的列族中。

Row Key

Timestamp

Column Family anchor

"com.cnn.www"

t9

anchor:cnnsi.com="CNN"

"com.cnn.www"

t8

anchor:my.look.ca="CNN.com"

Row Key

Timestamp

Column Family contents

"com.cnn.www"

t6

contents:html="<html>..."

"com.cnn.www"

t5

contents:html="<html>..."

"com.cnn.www"

t3

contents:html="<html>..."

在概念视图中的空单元格不会被存储,因此在 t8 时间戳上查询 contents:html 列的值,将不会返回任何内容。

然而,如果没有提供时间戳字段,则会返回给定列的最新值。如果提供了多个时间戳字段,则会返回第一个找到的值,也是最新的值,因为时间戳是按倒序存储的。因为在 com.cnn.www 行键上查询所有列的数据,如果没有指定时间戳的话,将会返回 t6 时间戳的 contents:html 列的值、t9 时间戳的 anchor:cnnsi.com 列的值、t8 时间戳的 anchor:my.look.ca 列的值。

最后更新于1年前

下面这个例子是 论文第二页中的示例的略微修改版。

BigTable