付出,终有回报!
分类: HADOOP
2017-02-23 22:57:55
在HBase中,数据存储在表中,表中有行和列。这个与关系型数据库(RDBMSs)的术语有些类似,但这并不是一个对我们有帮助的类比。相反,把一个HBase的表当成一个多维的Map对我们更有益处。
HBase数据模型术语
Table(表)
一个HBase表包含多个行
Row(行)
在HBase里,row是由row key和一个或多个列及其值组成。数据在被存储的时候,是按row key的字母排序存储的。因此,row key的设计是非常重要的。这样存储数据的目的就是为了让相关的行存储在相邻的位置。一个常见的row key模式是一个网站的域名。如果你的row key是域名,你应该倒着存储他们(org.apache.www,org.apache.mail,org.apache.jira)。这种方式,使得所有的Apache域名在表中是相邻存储的,而不是基于子域名的首字母展开。
Column(列)
HBase的一列由列簇和列修饰符组成,他们通常由冒号(:)分隔。
Column Family(列簇)
通常为了性能原因的考虑,列簇会把列和相应的值物理上联合在一起。每个列簇是一个存储属性的集合,例如它的值是否应该缓存在内存中,它的数据是如何压缩或它的row key是如何编码,以及其他。表中的每个行都有相同的列簇,但是一行也可能没有存储一个列簇里的任何数据。
Column Qualifier
列修饰符被加到一个列簇,以提供对一个数据片段的索引。规定一个列簇为content,一个列修饰符可能是content:html,另外一个可能是content:pdf。尽管列簇是在创建表的时候固定了,但列修饰符是可变的,在行之间可能存在很大的不同。
Cell
一个Cell是行,列簇和列修饰符的组合,并且包含一个值和时间戳,时间戳代表着值的版本。
Timestamp(时间戳)
一个时间戳是連同值一起被写入的,是值版本的唯一标识,默认情况下,时间戳表示数据写入时RegionServer的时间,但是当你在写数据到Cell的时候,你可以指定一个不同的时间戳。
一、概念视图
你可以从Jim R. Wilson写的博文中读到一个对HBase数据模型很好理解的解释。另外一个好的描述是Amandeep Khurana的。
它可能可以帮助你读到不同的方面,以此让你获得一个对HBase模式设计的更好的理解。链接的文章覆盖了这部分信息的相同范围。
下面这个例子是对论文的第2頁的表进行了轻微的修改的形式。有一个表叫做webtable,它包含两行(com.cnn.www和com.example.www)和三个列簇(contents,anchor,和people)。在这个例子中,对于第一行(com.cnn.www),anchor包含两列(anchor:cssnsi.com,anchor:my.look.ca)和包含一个列(contents:html)的contents。这个例子包含了5个row key为com.cnn.www的版本,和1个row key为com.example.www的版本,列修饰符contents:html包含了网站的整个html,anchor列簇的修饰符含有該行出现的外部站点及文本,即超链接的文本和链接地址。列簇people表示与站点相关的人。
列名 按照惯例,一个列名由它的列簇的前缀和一个修饰符组成。例如,列contents:html是由列簇contents和修饰符html构成。列簇和列修饰符由冒号(:)分隔开来。
Table 4. 表webtable
Row Key | Time Stamp | ColumnFamily contents | ColumnFamily anchor | ColumnFamily people |
---|---|---|---|---|
"com.cnn.www" | t9 | anchor:cnnsi.com = "CNN" | ||
"com.cnn.www" | t8 | anchor:my.look.ca = "CNN.com" | ||
"com.cnn.www" | t6 |
contents:html = “
...”
|
||
"com.cnn.www" | t5 |
contents:html = "
..."
|
||
"com.cnn.www" | t3 |
contents:html = "
..."
|
在HBase里,表里的Cell要么实际存在,要么为空且不占用空间。这就使得HBase变得“稀疏”。表格的方式不是查看HBase数据的唯一或最准确的方式。以下使用多维Map呈现了同样的信息。这只是为了描述为目的的一个模拟,可能不是非常准确。
{ "com.cnn.www": { contents: { t6: contents:html: "..." t5: contents:html: "..." t3: contents:html: "..." } anchor: { t9: anchor:cnnsi.com = "CNN" t8: anchor:my.look.ca = "CNN.com" } people: {} } "com.example.www": { contents: { t5: contents:html: "..." } anchor: {} people: { t5: people:author: "John Doe" } } }