理解 HBase 的数据模型,能够更好的理解 HBase 针对 Region 的操作(Split、Compact等)的必要性。
逻辑模型
HBase 记录的逻辑模型图如下:
Rowkey 作为每条记录的唯一不重复ID,ColumnFamily 包含一些 Columns,Column 的值有自己版本(版本默认是时间戳)
物理模型
每一个 Column 的值以 Key-Value 的形式作为一条记录存储,参考 HFile v1 的数据结构:
Physical Row以下部分是固定长度:KeyLength、ValueLength、RowLength、ColumnFamilyLength、TimeStamp、KeyType
以下部分是可变长度:Row、ColumnFamily、ColumnQualifier、Value
可以看到每条记录中都会包含的与Value无关的信息是:Row、ColumnFamily、ColumnQualifier,所以在实际应用中,他们的值不宜设置的太长,会占用大量的存储空间。
已知的 HFile 中存储的是同一个 ColumnFamily 的数据,不清楚为什么把 ColumnFamily 的信息放在每一条记录中,而不是放在 HFile 中。
逻辑视图
逻辑视图参照下图,整个表按照 Rowkey 的字典序排列
逻辑视图类似传统数据库的表,按照 ColumnFamily 垂直切分(CF管理不同的 Column),按照 Region 水平切分(Region 管理一段连续的 Rowkey)
物理视图
在物理存储上,参考前面的物理模型,可以描绘出下图:
可以看到不同的 Column Family 存储在不同的文件中,每个逻辑单元格(cell)会对应一行数据,由 Timestamp 标记版本,每次插入、删除都会生成新的一行数据(append-only)。由于 append only 的这种特性,写的效率会比较高。
注意:每个 Rowkey 的数据可能分布在不同的 HFile 中。物理视图并不代表实际存储的格式,实际存储中还有很多 meta 和 index 等信息。
网友评论