一、HBase是什么?
1、HBase是基于Apache Hadoop的数据库,由Chang等人基于Google的BigTable开发而成。其目标是只需使用普通的硬件配置就可以处理由成千上万的行和列(billions of rows X millions of columns)所组成的大数据。
2、HBase是一种 "NoSQL" 数据库. "NoSQL"是一个通用词表示数据库不是RDBMS ,后者支持 SQL 作为主要访问手段。有许多种 NoSQL 数据库: BerkeleyDB 是本地 NoSQL 数据库例子, 而 HBase 是大型分布式数据库。 技术上来说, HBase 更像是"数据存储(Data Store)" 多于 "数据库(Data Base)"。因为缺少很多RDBMS特性, 如列类型,第二索引,触发器,高级查询语言等.
二、HBase有什么特点?
1、按列存储:可以动态的增加属性列;列值为空的不存储,节省空间;可以实现高性能的并发读写操作。
2、数据类型全部为字符串
2、只支持简单的增删查操作,不支持连接查询和条件查询
4、数据更新时会保留旧版本的数据
5、可伸缩性强,可以对数据进行透明的切分,便于分布式存储
三、什么时候用HBase?
HBase不适合所有问题.
首先,确信有足够多数据,如果有上亿或上千亿行数据,HBase是很好的备选。 如果只有上千或上百万行,则用传统的RDBMS可能是更好的选择。因为所有数据可以在一两个节点保存,集群其他节点可能闲置。
其次,确信可以不依赖所有RDBMS的额外特性 (e.g., 列数据类型, 第二索引, 事物,高级查询语言等.) 一个建立在RDBMS上应用,如不能仅通过改变一个JDBC驱动移植到HBase。相对于移植,需考虑从RDBMS 到 HBase是一次完全的重新设计。
第三, 确信你有足够硬件。甚至 HDFS 在小于5个数据节点时,干不好什么事情 (根据如 HDFS 块复制具有缺省值 3), 还要加上一个 NameNode.
HBase 能在单独的笔记本上运行良好。但这应仅当成开发配置。
四、HBase的数据模型
简单来说,应用程序是以表的方式在HBase存储数据的。表是由行和列构成的,所有的列是从属于某一个列族的。行和列的交叉点称之为cell,cell是版本化的。cell的内容是不可分割的字节数组。表的行键也是一段字节数组,所以任何东西都可以保存进去,不论是字符串或者数字。HBase的表是按key排序的,排序方式是针对字节的。所有的表都必须要有主键-key.
1、概念视图
下面是根据BigTable 论文稍加修改的例子。
有一个名为webtable
的表,包含两个列族:contents
和anchor
.在这个例子里面,anchor
有两个列 (anchor:
cssnsi.com
, anchor:
my.look.ca
),contents
仅有一列(contents:
html
)
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>..." |
contents
加冒号(
:
)加
修饰符
html
组成的。
2、物理视图
尽管在概念视图里,表可以被看成是一个稀疏的行的集合。但在物理上,它的是区分列族 存储的。新的columns可以不经过声明直接加入一个列族.
ColumnFamily anchor
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" |
ColumnFamily contents
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>..." |
值得注意的是在上面的概念视图中空白cell在物理上是不存储的,因为根本没有必要存储。因此若一个请求为要获取t8
时间的contents:html
,他的结果就是空。相似的,若请求为获取t9
时间的anchor:my.look.ca
,结果也是空。但是,如果不指明时间,将会返回最新时间的行,每个最新的都会返回。例如,如果请求为获取行键为"com.cnn.www",没有指明时间戳的话,活动的结果是t6
下的contents:html,t9
下的anchor:cnnsi.com
和t8
下anchor:my.look.ca
。
五、参考
1、Apache HBase:http://hbase.apache.org/
2、HBase 官方文档中文版:http://abloz.com/hbase/book.html
3、NOSQL之旅---HBase:http://www.jdon.com/38244
4、HBase按列存储的真相:vemitter.blog.163.com/blog/static/16579813420121965726138/