5

因为 HBase 表是稀疏表,所以 HBase 不仅为每个单元存储值,还存储识别单元所需的所有信息(通常描述为 Key,不要与 RowKey 混淆)。密钥如下所示:

RowKey-ColumnFamily-ColumnQualifier-时间戳

所有这些信息都存储在每个条目中。这就是为什么建议使用 Column Families 和 Column Qualifiers 的短名称来减少额外开销的原因。

我的问题:为什么我需要为每个条目存储 ColumnFamily?据我了解,每个存储文件都属于一个列族。每个存储文件存储一次列族名称还不够吗?这将减少开销,可以使用任意列族名称,并且我们仍然能够识别每个条目的列族。我在这里想念什么?

4

2 回答 2

2

与关系数据库一样,HBase 中的表由行和列组成。在 HBase 中,列在列族中分组在一起。这种分组在逻辑上表示为地图地图中的一层。列族也以物理方式表示。每个列族在磁盘上都有自己的一组 HFile。这种物理隔离允许一个列族的底层 HFile 与其他列族隔离管理。就压缩而言,每个列族的 HF 文件都是独立管理的。

于 2014-07-04T07:55:49.960 回答
0

我认为原因可能只是由于简单性以及密钥结构直接映射到 RPC 表示的事实。在写入之前删除列族并在阅读后重新创建它需要更多的内部复制和翻译。我猜性能权衡比听起来更重要,但我不知道 HBase 开发人员是否尝试过这种特殊的变体。我确实知道,如果您担心列族和列的空间,您可以打开数据块编码以最小化开销。您还可以查看Kiji 项目,它为您处理缩短这些名称以及为您的代码提供翻译层,这意味着您仍然可以使用更长的名称而不必担心成本。

于 2014-07-02T15:23:22.167 回答