2006年google技术人员Fay Chang发布了一篇文章《Bigtable: A Distributed Storage System for Structured Data》。该文章向世人介绍了一种分布式的数据库,这种数据库可以在局部几台服务器崩溃的情况下继续提供高性能的服务。
2007年Powerset 公司的工作人员基于此文研发了bigtable的java开源版本,即HBase。刚开始它只是Hadoop的一部分。
2008年HBase成为了Apache的顶级项目。HBase几乎实现了bigtable的所有特性。它被称为一个开源的非关系型分布式数据库。
2010年HBase的开发速度打破一直以来跟Hadoop版本一致的惯例,因为HBase的版本发布速度已经超越了Hadoop。它的版本号一下从0.20.x 跳跃到了 0.89.x。
为什么要用HBase
HBase的存储是基于Hadoop的。Hadoop 是这些年崛起的拥有着高性能,高稳定,可管理的大数据应用平台。Hadoop已经快要变为大数据的代名词了,基于Hadoop衍生出了大量优秀的开源项目。
Hadoop实现了一个分布式文件系统HDFS。HDFS有高容错性的特点,被设计用来部署在低廉的硬件上;而且它提供高吞吐量以访问应用程序的数据,适合那些有着超大数据集的应用程序。基于Hadoop意味着HBase与生俱来的超强的扩展性和吞吐量。
HBase采用的是Key/Value的存储方式,这意味着,即使随着数据量增大,也几乎不会导致查询的性能下降。HBase又是一个列式数据库(对比于传统的行式数据库而言),当你的表字段很多的时候,你甚至可以把其中几个字段放在集群的一部分机器上,而另外几个字段放到另外一部分机器上,充分分散了负载压力。然而,如此复杂的存储结构和分布式的存储方式带来的代价就是:哪怕只是存储少量数据,它也不会很快。所以我常常跟人说:
“HBase并不快,只是当数据量很大的时候它慢的不明显”
凡事都不可能只有优点而没有缺点。数据分析是HBase的弱项,因为对于HBase乃至整个NoSQL生态圈来说,基本上都是不支持表关联的。当你想实现group by 或者order by的时候,你会发现,你需要写很多的代码来实现MapReduce。
因此,请不要盲目地使用HBase。
当你的情况大体上符合以下任意一种的时候:
- 主要需求是数据分析,比如做报表。
- 单表数据量不超过千万。
请不要使用HBase,使用mysql或者Oracle之类的产品可以让你的脑细胞免受折磨。
当你的情况是:
- 单表数据量超千万,而且并发还挺高。
- 数据分析需求较弱,或者不需要那么灵活或者实时。
请使用HBase,它不会让你失望的。