在HBase中,数据存储在具有行和列的表中。这是与关系数据库(RDBMS)的术语重叠,但这并不是一个有用的类比。相反,将HBase表视为多维映射会有所帮助。
HBase数据模型术语
表
一个HBase表由多行组成。
行
HBase中的一行由行键和一列或多列与它们相关联的值组成。行在存储时按行键按字母顺序排序。因此,行键的设计非常重要。目的是以相关行彼此靠近的方式存储数据。常见的行rowkey模式是网站域。如果行键是域,则可能应该反向存储它们(org.apache.www,org.apache.mail,org.apache.jira)。这样,表中所有的Apache域都彼此靠近,而不是根据子域的第一个字母散布开来。
列
HBase中的列由列族和列限定符组成,它们由:(冒号)字符分隔。
列族
出于性能考虑,列族实际上将一组列及其值并置在一起。每个列族都有一组存储属性,例如是否应将其值缓存在内存中,如何压缩其数据或对其行键进行编码等。表中的每一行都具有相同的列族,尽管给定的行可能不会在给定的列族中存储任何内容。
列限定词
将列限定符添加到列族,以提供给定数据段的索引。给定列族内容,列限定符可能是content:html,另一个可能是content:pdf。尽管列族在创建表时是固定的,但列限定符是可变的,并且行之间的差异可能很大。
Cell
单元格是行,列族和列限定符的组合,并包含一个值和一个时间戳,代表该值的版本。
时间戳
时间戳记与每个值一起写入,并且是值的给定版本的标识符。默认情况下,时间戳表示写入数据时在RegionServer上的时间,但是在将数据放入单元格时,可以指定其他时间戳值。
举个例子
该表中看起来为空的单元格在HBase中不占用空间,或者实际上不存在。 这就是使HBase“稀疏”的原因。 表格视图不是查看HBase中数据的唯一可能方法,甚至不是最准确的方法。 以下代表与多维Map相同的信息。 这仅是出于说明目的的模型,可能并非严格准确。
{
"com.cnn.www": {
contents: {
t6: contents:html: "<html>..."
t5: contents:html: "<html>..."
t3: contents:html: "<html>..."
}
anchor: {
t9: anchor:cnnsi.com = "CNN"
t8: anchor:my.look.ca = "CNN.com"
}
people: {}
}
"com.example.www": {
contents: {
t5: contents:html: "<html>..."
}
anchor: {}
people: {
t5: people:author: "John Doe"
}
}
}
尽管从概念上讲,表可以看作是行的稀疏集合,但它们实际上是按列族存储的。 可以随时将新的列限定符(column_family:column_qualifier)添加到现有的列族。
概念视图中显示的空单元格根本不存储。 因此,在时间戳记t8处对content:html
列的值的请求将不返回任何值。 同样,在时间戳t9处请求anchor:my.look.ca值的请求将不返回任何值。 但是,如果未提供时间戳,则将返回特定列的最新值。 给定多个版本,因为时间戳以降序存储,所以最新的也是找到的第一个版本。 因此,如果未指定时间戳,则对com.cnn.www行中所有列的值的请求为:来自时间戳t6的content:html的值,来自时间戳t9的anchor:cnnsi.com的值, 时间戳记t8中的anchor:my.look.ca。