对Hypertable中数据行存储的理解

一、背景

Hypertable与Hadoop中HBase一样,是一种分布式No SQL库,本文结合作者对Hypertable的理解,描述一下对这种key-value存储形式的表的理解。关于Hypertable的基础知识,见作者翻译的系列文章。

以下的例子基于mytable这个表,表的定义如下:

CREATETABLE mytable(
name,
score,
desc,
ACCESS GROUP default (name,score),
ACCESS GROUP desc(desc)
);

二、Hypertable中表的存储

Hypertable中表是如何表达和存储的,这是我们理解这种类型表的关键。

Hypertype内部存储数据的格式是CellStore格式,CellStore是Hypertable操作磁盘的最小单位,缺省是64K,可以通过Hypertable.RangeServer.CellStore.DefaultBlockSize设置其大小,若干个CellStore再加上必要的索引等就构成了一个CellStore文件,RangeServer就是操作若干个CellStore文件来达到存储、更新数据的功能。

Access Group从文档的理解是将若干列保存在一起的单位,但如何与真正的存储结构CellStore对应,未找到文档说明。【以下是个人的理解】如果CellStore是磁盘IO操作的基本单位,那么一个CellStore只能保存一个AccessGroup,,也就是说,一个CellStore中的列,其Access Group是相同的。如果一个表有两个以上的Access Group,这些Access Group将保存在不同的CellStore中。

由于表是按Access Group来存储,一个表如果有多个Access Group与将该表拆分成多个表,从Hypertable上来看,并无区别。正如Doug自己所说的:

Aside from the difference in query support, there is no difference between 1 table-multiple access groups and two tables.(Doug Judd)

三、数据的插入

Hypertable中,将数据插入到表中,与关系库不同。先看Insert的语法:


INSERT INTO table_name VALUES value_list

value_list:
    value_spec [',' value_spec ...]

value_spec:
    '(' row ',' column ',' value ')'
    '(' timestamp ',' row ',' column ',' value ')'

column:
    family [ ':' qualifier ]

timestamp:
    YYYY-MM-DD HH:MM:SS[.nanoseconds]

从上面的定义,insert有两种格式:

(row, column, value)
(timestamp, row, column, value)

也就是说,一次只能插入一个(key,value),那么,在建表时,建立一个有多个列表与建立多个两列(key,value)的表,不考虑读取效率的话,其实也没有区别。

有文章中说,系统的索引用table_id:end_row_key表示,table id是表在创建时,系统赋予的唯一表标识号,0号码保留给metadata table用。end_row_key是一个任意字符串,表示该记录指向的tablet的最后一行的row key。

如果Hypertable真的如上述方式来索引记录,那么从系统的角度来看,整个系统就是一个大表,各个记录都保存在这个表中。不同的建表方式,只是表述某条记录在这个大表中存储的位置不同而已。






你可能感兴趣的:(对Hypertable中数据行存储的理解)