HBase存储结构
hbase:表,列族,列标识,版本和cell
HBase是面向列的分布式的数据库,和传统的关系型数据库有很大的不同:物理模型和逻辑模型。这里先讲一下HBase数据库相关的区别于关系型数据库的几个基本概念:表:HBase将数据组织到自己的HTable表中,这个表是根据列族(colomn family)在物理上保存数据的,每个列族都有自己的文件夹和storefiles,不像关系型数据库那样将一个表保存成一个文件,表明也是文件系统路径的一部分。
行:HBase中的行是逻辑上的行,物理上模型上行是按列族(colomn family)分别存取的。HBase有Rowkey的概念,rowkwy没有数据类型,总是被认为是byte[],它相当于关系型数据表中的主键。另外Rowkey设计的好坏对读取数据有很长大的关系,可以被认为是设计HBase表是最重要的一个环节。而系型数据表中的行是真正意义上的行,逻辑上和物理上都是按行组织数据。
列族:HBase表中的行是按一个叫colomn family的列族分组的,也是在磁盘上也是按列族存储数据的,由于这个原因,故当定义一个hbase表时,除了定义表名外,还必须定义列族。传统数据库没有列族的概念。
列标识:一个列族中的数据是通过一个叫colomn qualifier的具体描述每一列。列标识在标定一种可以动态定义,既可以在表定义时定义,也可以在保存数据时定义。而系型数据库的表没有此概念。
版本:HBase中的数据有版本的概念,每次生成或修改数据时都保存一个版本信息——这个版本数据就是一个时间戳,可以再定义表时动态设置保存行的版本数量,默认版本数为1,同一行的不同版本的数据是按时间戳倒叙排列的,而其他数据如rowkey和列标识是按字典顺序排列的,这也是读数据操作的一种优化手段。对于某一行,当保存的行的版本数大于设置的值后,最老的版本的数据行就会在执行Major compaction时被删除掉。版本数据是默认添加的,其值时保存数据时的时间戳,long型(长整型)。而系型数据库的表没有此概念。
Cell:在HBase表中,是由rowkey + (colomn family:colomn qualifier) + version来标识一个cell,用户保存的具体数据是保存在这个cell中的,它的值时byte[]类型的,需要在客户端将之改为需要的类型。
table、row、rowkey、colomn family、colomn qualifier、version(timestamp)和cell示意图
对于上图可以看出:
rowkey ->jacky20130429 jacky20130430
comlom family -> info events
version ->t3 t6 t9等
colomn qualifier ->
sex address type name
对于表的2个列族info和events,会被分别保存到磁盘上。
由于【jacky20130429,info,email,t9】 ------> jacky@163.com,故HBase可以被看做是key-value的数据库。另外,HBase也可以被看做有排序的Map的Map:
SortedMap<Rowkey,List<SortedMap<Colomn,List<value,timestamp>>>>
第一层的SortedMap代表HBase的HTable,包括一个colomn families的集合,每个列族包括又一层的SortedMap,这层的SortedMap里包括列和相关联的数据的集合。
HBase表中的行是有原子性的,但是一行的不同版本可能分布在不同的storefile文件中,过期失效的数据只能在Major Compaction操作时删除。