本篇来自 《HBase 实战》之 “HBase 表设计”。
我们需要思考几个问题:
- 一张表需要多少列族?
- 一个列族需要多少列?
- 什么数据应当存入列名中?
- 什么数据应当存入单元?
这里将会学习一下 HBase 的模式设计,讨论 HBase 设计模式和行键应该考虑的东西,为了应对系统的访问模式需要进行性能优化。
模式简单会有更多的调整空间:有些模式的写性能很棒,但是读取数据时表现却不好,或者正好相反。
当说到模式(schema)的时候,要考虑到如下内容:
- 这个表应该有多少列族?
- 列族使用什么数据?
- 每个列族应该有多少列?
- 列名应该是什么?尽管列名不必在建表时定义,但是读写数据时需要知道的。
- 单元存放什么数据?
- 每个单元存储多少个时间版本?
- 行键结构是什么?应该包括什么信息?
一个特定列族的所有数据在 HDFS 上会有一个物理存储。
这个物理存储可能由多个 HFile 组成,理想情况下可以通过合并得到一个 HFile。
一个列族的所有列在硬盘上存放在一起,使用这个特性可以把不同访问模式的列放在不同列族,以便隔离它们。
这也是 HBase 被称为 面向列族的存储(column-family-oriented store)的原因。
重要的事情是定义访问模式,也就是应用系统如何访问 HBase 表里的数据。
用户关注的例子
读访问模式:
- TheFakeMT 关注了谁?
- TheFakeMT 关注了 TheRealMT 了吗?
- 谁关注了 TheFakeMT?
- TheRealMT 关注了 TheFakeMT 了吗?
写数据到 HBase:
- 一个用户关注了某人
- 一个用户取消关注某人
HBase 不支持事务
HBase 把一切数据存储为字节数组(byte[]),可以在一个列族里拥有任意数量的列。
列限定符将使用 follower 的用户名,而不再是它们在关注用户列表里面的位置。
现在单元值可以是任何内容,因为单元不能是空的,所以需要存点东西,所以输入数字 1。