逻辑视图
HBase以表的形式存储数据。表由行和列组成,列划分为若干个列族(row family)。HBase的数据存储逻辑视图如下表所示。
Row Key(行键) | 时间戳 | 列族Content | 列族anchor | 列族mime | |
---|---|---|---|---|---|
com.cnn.www | t9 | — | anchor:cnnsi.com | CNN | — |
t8 | — | anchor:my.look.ca | CNN.com | — | |
t6 | Contents.html=“<html>…” | — | — | “text/html” | |
t5 | Contents.html=“<html>…” | — | — | — | |
t3 | Contents.html=“<html>…” | — | — | — |
表中的参数说明如下。
1)Row Key
Row Key(行键)是数据行在表中的唯一标识,并作为检索记录的主键。访问HBase table中的行只有三种方式:
(1)通过单个行键访问;
(2)通过行键的范围访问;
(3)通过全表扫描访问。
行键可以是任意字符串(最大长度是 64KB,实际应用中长度一般为10~100B),在HBase内部,行键保存为字节数组。存储时,数据按照行键的字典序(Byte Order)排序存储。设计键时,要将经常一起读取的行存储到一起。
注意:
字典序对int排序的结果是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进行左填充。
行的一次读写是原子操作(无论一次读写多少列)。这个设计决策能够使用户很容易地理解程序在对同一个行进行并发更新操作时的行为。
2)列族
HBase表中的每个列都归属于某个列族。列族是表的Chema的一部分(而列不是),必须在使用表之前定义。列名都以列族为前缀,如courses:history、courses:math都属于courses 这个列族。
列族定义为:<family>:<qualifier>(<列族>:<限定符>)
通过列族和限定符两部分可以唯一地指定一个数据的存储列。HBase在磁盘上按照列族储存数据,所以一个列族里所有的项最好具备相同的读/写方式,以提高性能。
访问控制磁盘和内存的使用统计都是在列族层面进行的。在实际应用中,列族上的控制权限能帮助用户管理不同类型的应用,一些应用可以添加新的基本数据、一些应用可以读取基本数据并创建继承的列族、一些应用则只允许浏览数据(甚至可能因为隐私的原因而不能浏览所有数据)。
3)时间戳
HBase 中通过行和列确定的单个存贮单元称为cell(元素)。每个 cell都保存同一份数据的多个版本,版本通过时间戳来索引,时间戳的类型是 64位整型,时间戳可以由HBase(在数据写入时自动)赋值,此时时间戳是精确到毫秒的当前系统时间。时间戳也可以由客户显式赋值。如果应用程序要避免数据版本冲突,就必须自己生成具有唯一性的时间戳。每个cell中,不同版本的数据按照时间倒序排列,即最新的数据排在最前面。
为了避免数据存在过多版本造成管理(包括存储和索引)负担,HBase提供了两种数据版本回收方式:一是保存数据的最后n个版本,二是保存最近一段时间内的版本(如最近七天)。用户可以针对每个列族进行设置。
4)cell元素
HBase中的元素由行健、列(<列族>:<限定符>)和时间戳唯一确定,元素中的数据以字节码的形式存储,没有类型之分。
学员评价