介绍:
BigTable数据模型和后来的HBase数据模型相似,因为后者是克隆的前者,这种数据模型适用于数据密集型的系统。从关系型数据库获得可伸缩性并不能通过简单地添加机器来完成,因为它的数据模型是基于单机架构的。比如,在两个表上的JOIN操作在内存中完成,并没有考虑数据可能会在其它机器上的可能性。那些提倡关系型分布式数据库的公司必须要做很多的重新设计来实现相应的功能,这也是为什么它们的许可费用那么高的原因。另一个选择是读写分离,最后的选择是在子数据库中进行分表操作。
概况
简单来说,HBase可以被简化为一个Map<byte[],Map<byte[], Map<byte[], Map<Long, byte[]>>>>。(丛最外层开始)第一个Map将行键和它们的列族映射起来。第二个将列族和它们的列的键映射起来。第三个将列的键和它们的时间戳映射起来。最后一个将时间戳和一个单一的值映射起来。键是一些字符串,时间戳是一个长整形,而值是一个没有被解释过的字节数组。列的键前面总是跟着它的列族,显示成这个样子:family:key。既然一个族映射到另一个映射,这意味着一个列族可以包含理论上的无数个列键。所以,要获取一个值,用户必须使用下面三个键做一次get操作:
row key+column key+timestamp -> value
行
行键被HBase作为一个字节数组来对待,但是它必须是代表一个字符串。行键映射一个特殊的属性是它保持它们一个字典序。比如,从1到100将会被这样排序:1,10,100,11,12,13,14,15,16,17,18,19,2,20,21,...,9,91,92,93,94,95,96,97,98,99。
要保持整形的自然序,行键必须用0作左填充。要利用这个的好处,行键映射提供一个扫描器,这个扫描器使用一个开始行键(如果没有指明就是第一个)和一个终止行键(如果没有指明,就是最后一个)。比如,如果行键是以YYYYMMDD格式的日期,要获得2008年7月就是开启一个从20080700到20080800的扫描器。它不管指定的行键是否存在,只有一件事情需要记住,终止行键不能返回,这也是为什么8月的第一天被传递给扫描器。
列族
列族是HBase中具有相同特征的数据的重组并且没有类型的限制。列族是表模式的一部分,每一行都是一样的;行与行之间不同的是列键可以非常不同。比如行“20080702”可以在它的“info:”族中有以下的列键:
Info:aaa
Info:bbb
Info:ccc
而行“20080703”只有:
Info:12342
开发者在使用列键时必须非常小心,因为长度为0的键是允许的,这就意味着前面的例子中可以被插入列键“info:”。我们强烈建议只有在其他键不会被指定的时候使用空列键。还有,既然族中的数据具有相同的特征,很多属性可以根据性能和时间戳来指定。
时间戳
HBase中的值根据族的配置可以保持多个版本。默认的,HBase以当前时间的毫秒表示来设置当前的时间戳并在一个单位被取出时返回最新的版本。开发者可以在插入数据的时候提供他们自己的时间戳,就像他们可以在取数据的时候指定某个时间戳。
族属性
列族的下列属性可以被指定:
1. 已经实现了的
压缩:
记录:意思是用rowkey+columnkey+timestamp找到的每个值将被独立地压缩。
块 :意思是在HDFS中的块被压缩。如果记录小于HDFS块的大小,一个块可能包含多条记录;如果一条记录大于HDFS块大小,一个块只包含一条记录的一部分。
时间戳:
最大数:一个值可以拥有的最大数量的不同版本数。
生存时间:旧于某个指定时间的版本将被回收。
块缓存:以LRU风格的队列,缓存从HDFS中取到的块。改善了随机读性能并且在等待全内存存储时一个很好的特性。
2. 还没有实现的
驻留内存:所有的那个族的地值保存在内存中。
长度:写入的数据不能长于某个指定的字节数。