HBase的数据模式是怎么样的?即有哪些元素?如何存储?等
1). 数据模式
如下列三个表:
第一个是一个稀疏的表,实际上它是一个虚表,仅是一个概念视图,不是真实的存储形式,它来源于后两个表。
而后两个表才是真正的表,物理视图,他们是实际的存储形式,而且它们是按列族进行存储的。
Row Key | Time Stamp | ColumnFamily contents | ColumnFamily anchor |
"com.cnn.www" | t9 |
| anchor:cnnsi.com = "CNN" |
"com.cnn.www" | t8 |
| anchor:my.look.ca = "CNN.com" |
"com.cnn.www" | t6 | contents:html = "<html>..." |
|
"com.cnn.www" | t5 | contents:html = "<html>..." |
|
"com.cnn.www" | t3 | contents:html = "<html>..." |
|
Row Key | Time Stamp | Column Family anchor |
"com.cnn.www" | t9 | anchor:cnnsi.com = "CNN" |
"com.cnn.www" | t8 | anchor:my.look.ca = "CNN.com" |
Row Key | Time Stamp | ColumnFamily "contents:" |
"com.cnn.www" | t6 | contents:html = "<html>..." |
"com.cnn.www" | t5 | contents:html = "<html>..." |
"com.cnn.www" | t3 | contents:html = "<html>..." |
2). HBase的基本元素:
表、行、列、单元格: 表的基本要素
键:一般是指行的键,即唯一标识某行的元素。表中的行,可以根据键进行排序,而对表的访问,也通过键。
列族:所有列族成员拥有相同的前缀,某列族的成员,需要预先定义,但也可以直接进行追加。
列族成员会一起放进存储器。而HBase面向列的存储,是面向列族的数据存储(这个通过上面那个表的示例可以看出来),数据存储与调优都在这个层次,HBase表与RDBMS中表类似,行是排序的,客户端可以把列添加到列族中去。
单元格cell: 单元格中存放的是不可分割的字节数组。并且每个单元格拥有版本信息。HBase的是按版本信息倒序排列。
区域region:将表水平划分,是HBase集群分布数据的最小单位。在线的所有区域就构成了表的内容。
加锁:对数据行进行更新,都需加锁。保持原子性。
3) 数据模型有哪些操作?
Get、Scan、Put、Delete,即返回特定行的属性,多行属性、插入、删除数据。
这些都需要一个HTable实例来操作。分别有Get、Scan、Put、Delete类来指定相应的参数、属性。
以scan为示例:
[java] view plaincopy
-
HTable htable = ... // instantiate HTable
-
-
Scan scan = new Scan();
-
scan.addColumn(Bytes.toBytes("cf"),Bytes.toBytes("attr"));
-
scan.setStartRow( Bytes.toBytes("row")); // start key is inclusive
-
scan.setStopRow( Bytes.toBytes("row" + (char)0)); // stop key is exclusive
-
ResultScanner rs = htable.getScanner(scan);
-
try {
-
for (Result r = rs.next(); r != null; r = rs.next()) {
-
// process result...
-
} finally {
-
rs.close(); // always close the ResultScanner!
-
}
4) 返回结果的排序方式是什么?
先是行、再是列族、再是列修饰符,最后是时间戳(反向排序,最新的在前面)。
5)最后,HBase不支持联合查询
6)mapreduce与HBase表配合使用,默认mapreduce的任务分割是根据HBase表中region的多少来分割,一个region就有一个map。