透视Hbase数据模型|概念视图|物理视图
在 HBase 中,数据存储在有行和列的表中。这是与关系数据库 (RDBMS) 的术语重叠,但这不是一个有用的类比。相反,将 HBase 表视为多维映射可能会对理解更有所帮助。先来看下hbase表模型的专业术语table (表):一个 HBase 表由多行组成。row(行):HBase 中的一行由一个行键和一个或多个具有与其关联的值的列组成。行在存储时按行键的字母顺序排序。为此,行键的设计非常重要
在 HBase 中,数据存储在有行和列的表中。这是与关系数据库 (RDBMS) 的术语重叠,但这不是一个有用的类比。相反,将 HBase 表视为多维映射可能会对理解更有所帮助。
先来看下hbase表模型的专业术语
- table (表):一个 HBase 表由多行组成。
- row(行):HBase 中的一行由一个行键和一个或多个具有与其关联的值的列组成。行在存储时按行键的字母顺序排序。为此,行键的设计非常重要。目标是以相关行彼此靠近的方式存储数据。常见的行键模式是网站域。如果您的行键是域,您可能应该将它们反向存储(org.apache.www、org.apache.mail、org.apache.jira)。这样,所有 Apache 域都在表中彼此靠近,而不是根据子域的第一个字母展开。
- column(列):HBase 中的列由列族和列限定符组成,它们由
:
(冒号)字符分隔。比如列contents:html由列族contents
和限定符html
组成 - Column Family (列族):Apache HBase中的列被分组为列族。列族中的所有列成员具有相同的前缀。例如,courses:history和courses:math这两个栏目都是courses栏目家族的成员。冒号字符(:)将列族与列族限定符分隔开来。列族前缀必须由可打印字符组成。列族必须在模式定义时预先声明,而列不需要在模式定义时定义,但可以在表启动和运行时动态更改。物理上,所有列家族成员都存储在文件系统上。因为调优和存储规范是在列族级别进行的,所以建议所有列族成员具有相同的通用访问模式和大小特征。
- Column Qualifier(列限定符):列限定符被添加到列族中以提供给定数据的索引。给定一个列族
content
,一个列限定符可能是content:html
,另一个可能是content:pdf
。尽管列族在表创建时是固定的,但列限定符是可变的,并且在行之间可能会有很大差异。 - cell(单元格)::一个{row, column, version}元组精确指定了HBase中的一个单元格cell。单元格内容是未解释的二进制字节,包含一个值和一个时间戳,它代表值的版本
- Timestamp(时间戳):每个值旁边都有一个时间戳,它是一个给定版本的值的标识符。默认情况下,时间戳表示写入数据时 RegionServer 上的时间,但您可以在将数据放入单元格时指定不同的时间戳值。
Hbase概念视图与本质
假如有一个名为webtable的表,它包含两行(com.cnn.www和com.example.www)和三个列族,分别是contents、anchor和people。
在这个例子中,对于第一行(com.cnn.www), anchor包含两列(anchor:cssnsi.com, anchor:my.look.ca), contents包含一列(contents:html)。这个例子包含行键为com.cnn.www的5个版本,以及行键为com.example.www的一个版本。
表webtable
此表中看起来为空的单元格不占用空间,或者实际上存在于 HBase 中。这就是 HBase“稀疏”的原因。表格视图不是查看 HBase 中数据的唯一可能方式,甚至不是最准确的方式。以下表示与多维map相同的信息。但注意这只是用于说明Hbase模型,可能并不完全准确。
表webtable的 Hbase Map视图
只是这里Hbase 使用的 Map 的主键更加复杂,是一个复合键由 row key行键 、column key列族(一个列族里可以在使用时任意添加拓展列,百万列的级别) ,qualifier列(也称限定符),type和 timestamp构成的KV键值对。
如上,其实我们发现每个键都指向一个包含3个键的映射:“contents”,“anchor”和“people”,这个我们称之为列族,列族的定义设置其实也就定义了多维map的框架是什么样,也就是第二层map的个数,我们又可以在第二层每个map里添加任意多个kv(map)键值对,是为列和列值。表的列族是在创建表时指定的,以后很难或不可能修改。添加新的列族也可能很昂贵,因此最好预先指定您需要的所有列族。
Hbase/BigTable 中表示的最后一个维度是时间。所有数据都使用整数时间戳(自纪元以来的秒数)或您选择的另一个整数进行版本控制。客户端可以在插入数据时指定时间戳。如上,同一个rowkey com.cnn.www 的contents:html的值就有多个时间版本。
Hbase实际的物理视图
尽管在概念级别Hbase表可能被视为一组稀疏的行,但它们在物理上是按列族存储的。可以随时将新的列限定符 (column_family:column_qualifier) 添加到现有列族中。
如上图所示,很好地阐述了hbase数据存储结构,但尤其注意同一个rowkey多个时间戳,不同列族列缺失的情况,是如何存储的。如下:
概念视图中显示的空单元格根本没有存储,稀疏的。因此,对contents:html
时间戳列的值的请求t8
将不返回任何值,因为t8这个时间戳只有anchor列族有值,而content列族是缺失的。同样,对anchor:my.look.ca
时间戳值的请求t9
不会返回任何值。但是,如果未提供时间戳,则将返回特定列的最新值。给定多个版本,最新的也是第一个找到的,因为时间戳是按降序存储的。
注意,假如一个rowkey:com.cnn.www的请求
未指定时间戳,则对行中所有列的值的请求结果将是:contents:html
的timestamp 为t6
的值,anchor:cnnsi.com的则是
timestamp为t9
的值、anchor:my.look.ca的
timestamp为t8 的值
。即返回每个rowkey 列族的最新timestamp对应的cell值。
更多推荐
所有评论(0)