Chap 4 HBase 数据模型

focus on:

  1. HBase 的列必属于某 (Column Family), 行列的交叉点为 Cell.

  2. HBase 没有数据类型, 任何列值被转换成 字节数组 进行存储

  3. HBase 表中的行是通过 (RowKey) 进行区分的, Table 中按 RowKey 排序的。

HBase 是一种面向列的分布式数据库。

4-1 两类数据模型

  1. Table 是 HBase 表达数据的逻辑组织方式, 基于的存储则是数据底层的组织方式

4.1.1 逻辑模型

HBase 是一个稀疏的、长期存储、多维度 和 排序的映射表, 表的每一行可以有不同的列

HBase 基本单位是 列, 多列 构成了行。行有 Rowkey, 相同行健的操作可以认为是对该行某些列的更新操作

HBase Table 有 若干行,每行有若干列,列中的值有多个版本, 每个版本的值成为 Cell
每个 Cell 存储的是 不同时刻该列的值。

列名是由 列族前缀 和 修饰符 连接而成。(冒号分隔)

4.1.2 物理模型

物理上,Table 是 按照 列 分开存储的。HBase 的列是按照 Column Family 分组的。

HFile 是 面向列的, 存放行的不同列的物理文件。一个 (Column Family) 的数据存放在多个HFile上
一个 Column Family 的数据会被同一个 Region 管理。

图片描述

4-2 数据模型的Define

  1. Table

  2. RowKey

  3. Column Family

  4. Cell

4.2.1 Table

一个Table的数据通常是相关的,通过 (Column Family) 进一步把一些列组织在一起进行访问。

table_name 作为 HDFS 存储路径的一部分来使用,HDFS一般每个 Table 的 name 都作为独立的目录结构。

Table 存储在不同的 Region, 每个 Region 只在一个 RegionServer 中提供服务, 而 Region 直接向 客户端提供存储和读取服务。

HBase 提供了 command 创建 Table, 创建 Table 时只需要指定 table_name 和至少一个 Column Family。Column Family 影响表的物理存储结构, 创建 Table 后 Column Family 还可以更改, 但是比较麻烦。

HBase, 可以使用 Shell 和 Java API 来访问。

访问 HBase 不需要密码,没有 Schema。HBase 提供了连接池

4.2.2 Rowkey

  1. RowKey 是 HBase 的唯一索引。

  2. RowKey 应该尽量平均分布,长度不宜过长。

4.2.3 Column Family

HBase 中的 (Column Family) 是一些 Column 的集合。

Column Family 成员示例 :

    courses:history, courses:math
    
    一个 Column Family 的成员在文件系统中是存储在一起的。
    经常查询的 Column 放在一个 Column Family。
    跨 Column Family 访问是低效的

4.2.4 Cell

HBase Cell 是由 Rowkey、Column-Family、Column、timestamp 唯一确定。
每个 Cell 保存同一份数据的多个版本。

Rowkey、Column(列族和列)、Version 组合在一起 成为 HBase 的一个 Cell。

4-3 数据模型的Operation

  1. Get

  2. Put
    (向表中增加新行或更新行, 频繁修改应创建 RowLock, 每次RPC, RPC多效率低,HBase客户端有一个缓冲区)

  3. Scan

  4. Delete

4-4 数据模型的Properties

  1. 版本 (Rowkey、Column、Version 组合在一个称为一个 单元格)

  2. 排序 (Get 和 Scan 操作返回的是经过 sort 的data)

  3. 列的元数据

  4. 连接查询

  5. 计数器 (ICV)

  6. 原子Operation

  7. 事务特性ACID

  8. 行锁

  9. 自动分区

  10. CAP原理与最终一致性

4.4.3. 列的元数据

KeyValue 对象表示 HBase 的最小单位是 Cell。

4.4.4. 连接查询

HBase 简单来说不支持 join

4.4.9. 自动分区

HBase 中的一个表的数据会被划分成很多的 Region, Region 可以动态扩展.

HBase 保证 Region 的负载均衡。

Region 是rowkey排序后的按规则分割的连续的存储空间。

每个 RegionServer 可以管理大约 100 ~ 1000 个 Region。
每个 Region 的大小是 1 ~ 20GB

Chap 5 HBase 表结构设计

focuses on :

  1. 如何设计 HBase 的模式 (Schema).

  2. 模式设计的要点 : Rowkey 和 Column Family

5-1 模式创建

HBase 的模式结构, 包括 Table、Rowkey、Column Family, Timestamp(时间版本)。

HBase 表设计模式与 RDBMS 对比

Property HBase RDBMS
数据类型 字符串 丰富的数据类型
数据操作 简单的增删改查, 不支持join 各种函数与表连接
存储模式 基于列式存储 基于表格结构和行式存储
数据保护 更新后保留旧版本 替换
可伸缩性 轻易增加节点,兼容性高 需要中间层,牺牲功能

HBase 模式设计考虑因素

  1. 这个 Table 有多少 Column Family ?

  2. Column Family 使用什么数据 ?

  3. 每个 Column Family 应该有多少 Column ?

  4. 列名 是什么? 读写数据是需要知道的

  5. 单元 应该存放什么数据 ?

  6. 单元 存储多少时间版本 ?

  7. Rowkey 结构是什么? 应该包含什么信息 ?

5-2 Rowkey 设计

Rowkey 决定了访问 HBase Table 的性能。

  1. Region 基于 Rowkey 为一个区间的行提供服务, 并负责区间的每一行。

  2. HFile 在硬盘上存储有序的行。

  3. Rowkey 是 HBase 的 KeyValue 存储中的 Key。

    当 Region 将内存中数据刷写为 HFile 时,这些行已经拍过序, 也会有序写在硬盘
    HBase 只能在 Rowkey 上建立索引。

1. Rowkey 是以字典序排序
2. Rowkey 尽量散列 Rowkey 设计

保证散列, 这样就会保证所有的数据都不是在一个 Region 上,避免读写的时候负载 Region
3. Rowkey 的长度尽量短

5-3 (Column Family) Define

物理上, 一个(Column Family)的成员在文件系统上都存储在一起,存储优化针对(Column Family)
现在 HBase 并不能很好地处理两个或者三个以上的 (Column Family)。要尽量减少 (Column Family), flush 和 compaction 操作是针对一个 Region的, 所以当一个 (Column Family) 操作大量数据的时候会引发一个 flush.

5.3.1 可配置的数据块大小 -(HFile 数据块大小可以在(Column Family)层次设置。HFile数据块不用于HDFS数据块。)
5.3.2 数据块缓存 (很多顺序化扫面会多次使用缓存,滥用缓存。最佳操作:关闭缓存)
5.3.3 布隆过滤器
5.3.4 数据压缩
5.3.5 单元时间版本 -(每个 Cell 只维护三个时间版本)
5.3.6 生存时间 - (用于设置 Cell 的生存周期, TTL)


blair
209 声望31 粉丝

我是 Blair


引用和评论

0 条评论