HBase Data Model
Conceptual View
- Table:HBase以table的形式组织数据,实质是类似Map的数据结构。Table需要在Schema定义时说明。
- Row:在Table内部,按行来存储数据,每一行由Row Key来唯一区分。Row Key可被看做是一个byte数组,所以可存储任意数据类型的数据。
- Column Family:每一行由若干列组成,而若干列又可组成一个列族(Column Family)。对于Column Family有两点需要注意:1)Column Family对存储数据存储的Physical Arrangement有影响,因此需要预先定义好,且不容易更改;2)table中的每一行拥有相同的列 族(与关系数据库中每一行拥有相同的列类似),即使某些行可能不在其所有的列族上存放数据。
- Column Qualifier:每一个列族可能有一个或一个以上的Column Qualifier。对余额Column Qualifier由以下几点主要注意:1)对于一个列族内的Column Qualifier数量没有限制,可存放任意数量的Column Qualifier;2)不需要预先定义好;3)根Row Key一样,是一个byte数组,可存放任意类型的数据。
- Cell:Row Key,Column Family和Column Qualifier可唯一确定一个Cell。Cell内的数据也是byte数组类型。
- TimeStamp:一个Cell内的数据是有版本号的,而版本号由时间戳来标明,默认情况下是写Cell时的时间。由以下几点需要注意:1)若进行写操作时没有指明时间戳,则默认为写操作时的当前时间,若进行读操作时没有指明时间戳,则默认返回时间戳最新的数据。2)版本号的数量由所在的列族指定,默认情况下是三个。
根据 Google's BigTable Paper A Bigtable is a sparse, distributed, persistent multidimensional sorted map。由于前面几个单词比较好理解,重点可放在后面三个单词。通过下图可更好的理解概念:
multidimentional 可理解为a map of maps,即有Row Key,Column Family,Column Qualifier三个dimensions,最后一个dimension为timestamp。
sorted是针对Row Key的。按官方文档的语言:Rows are lexicographically sorted with the lowest order appearing first in a table.即Rows 是按字典顺序从小到大排列的。
HBase API简单介绍
根据上述几个概念,HBase API提供了操作数据的三个主要方法:Put,Get和Scan。都在org.apache.hadoop.hbase.client中。其中Put和Get是针对特定Row的,在初始化时需要制定Row Key。而Scan针对一个范围内的Rows,初始化时需要制定start and stop row keys,如果没有指定,则默认是整个table。
参考文献
[1]Amandeep Khurana,Introduction to HBase Schema Design. [2]http://jimbojw.com/wiki/index.php?title=Understanding_HBase_and_BigTable.