数据在 RDBMS 中的排布示例
ID | 姓 | 名 | 密码 | 时间戳 |
---|---|---|---|---|
1 | 张 | 三 | 111 | 20160719 |
2 | 李 | 四 | 222 | 20160720 |
那么数据在 HBase 中的排布会是什么样子呢?如表 3 所示(这只是逻辑上的排布)。
表 3. 数据在 HBase 中的排布(逻辑上)
Row-Key | Value(CF、Qualifier、Version) |
---|---|
1 | info{'姓': '张','名':'三'} pwd{'密码': '111'} |
2 | Info{'姓': '李','名':'四'} pwd{'密码': '222'} |
在 HBase 中首先会有 Column Family 的概念,简称为 CF。CF 一般用于将相关的列(Column)组合起来。在物理上 HBase 其 实是按 CF 存储的,只是按照 Row-key 将相关 CF 中的列关联起来。物理上的数据排布大致可以如表 4 所示:
表 4. 数据在 HBase 中的排布
Row-Key | CF:Column-Key | 时间戳 | Cell Value |
---|---|---|---|
1 | info:fn | 123456789 | 三 |
1 | info:ln | 123456789 | 张 |
2 | info:fn | 123456789 | 四 |
2 | info:ln | 123456789 | 李 |
我们看到了两个 CF,分别是 info 和 pwd。info 存储着姓名相关列的数据,而 pwd 则是密码相关的数据。上表便是 info 这个 CF 存储在 Hbase 中的数据排布。Pwd 的数据排布是类似的。上表中的 fn 和 ln 称之为 Column-key 或者 Qulifimer。
在 Hbase 中,Row-key 加上 CF 加上 Qulifier 再加上一个时间戳才可以定位到一个单元格数据(Hbase 中每个单元格默认有 3 个时间戳的版本数据)。其实不管是 CF 还是 Qulifier 都是客户定义出来的。也就是说在 HBase 中创建表格时,就需要指定表格的 Row-key、CF 以及 Qulifier
这里我们先通过下图理解下 HBase 中,逻辑上的数据排布与物理上的数据排布之间的关系。
图 1. Hbase 中逻辑上数据的排布与物理上排布的关联
从上图我们看到 Row1 到 Row5 的数据分布在两个 CF 中,并且每个 CF 对应一个 HFile。并且逻辑上每一行中的一个单元格数据,对应于 HFile 中的一行。然后当用户按照 Row-key 查询数据的时候,HBase 会遍历两个 HFile,通过相同的 Row-Key 标识,将相关的单元格组织成行返回,这样便有了逻辑上的行数据。讲解到这,我们就大致了解 HBase 中的数据排布格式
一些使用 HBase 时候对表格设计的一些建议:
一个 HBase 数据库是否高效,很大程度会和 Row-Key 的设计有关。因此,如何设计 Row-key 是使用 HBase 时,一个非常重要的话题。随着数据访问方式的不同,Row-Key 的设计也会有所不同
那就是尽可能选择一个 Row-Key,可以使你的数据均匀的分布在集群中。这也很容易理解,因为 HBase 是一个分布式环境,Client 会访问不同 Region Server 获取数据。如果数据排布均匀在不同的多个节点,那么在批量的 Client 便可以从不同的 Region Server 上获取数据,而不是瓶颈在某一个节点,性能自然会有所提升。对于具体的建议我们一般有几条:
- 当客户端需要频繁的写一张表,随机的 RowKey 会获得更好的性能。
- 当客户端需要频繁的读一张表,有序的 RowKey 则会获得更好的性能。
- 对于时间连续的数据(例如 log),有序的 RowKey 会很方便查询一段时间的数据(Scan 操作)。
接着我们需要想想是否 Column Family 也会在不同的场景需要不同的设计方案呢。答案是肯定的
不过 CF 跟 Row-key 比较的话,确实也简单一些,但这并不意味着 CF 的设计就是一个琐碎的话题
而在 HBase 中,我们需要设计 CF 来聚合用户所有相关信息。简单来说,就是需要将数据按类别(或者一个特性)聚合在一个或多个 CF 中。这样,便可以根据 CF 获取这类信息。上面,我们讲解过一个 Region 对应于一个 CF。那么设想,如果在一个表中定义了多个 CF 时,就必然会有多个 Region。当 Client 查询数据时,就不得不查询多个 Region。这样性能自然会有所下降,尤其当 Region 夸机器的时候。因此在大多数的情况下,一个表格不会超过 2 到 3 个 CF,而且很多情况下都是 1 个 CF 就足够了。
转载于:https://www.ibm.com/developerworks/cn/analytics/library/ba-cn-bigdata-hbase/index.html