我们肯定听说过HBase,但是对于HBase的了解可能仅仅是它是Hadoop生态圈重要的一员,它是大数据技术圈一个很强的开源项目。然后内心os:它很屌,但是我用mysql/oracle。
一门技术的兴起,一个优秀的开源项目的存在肯定是有它所存在的意义,正如大数据一样,正是因为随着时间的发展,随着技术的发展导致我们每天的数据增量达到一个非常庞大的状态,同时在数据之中又能挖掘到很多有用的信息。所以才有了大数据技术的飞速发展。那么,我们为什么需要HBase,什么时候需要HBase呢?
HBase是什么?
HBase(Hadoop Database) 是一个高可靠性,高性能,可伸缩,面向列的分布式数据库(也许叫做存储系统会更加贴切)。
就跟Hadoop本身也是起源与Google发布的GFS和MapReduce相关的论文一样,HBase是Google BigTable的开源实现。它整体的架构与BigTable很类似。例如:
Google BigTable | HBase |
---|---|
利用GFS作为文件存储系统 | 利用HDFS作为文件存储系统 |
运行MapReduce处理存储的海量数据 | 同样利用Hadoop MapReduce处理海量数据 |
利用Chubby作为协同服务 | 利用Zookeeper作为协同服务 |
HBase与Hadoop的关系非常紧密,Hadoop的HDFS提供了高可靠性的底层存储支持,Hadoop MapReduce为HBase提供了高性能的计算能力,Zookeeper为HBase提供了稳定性及failover机制的保障。同时其他周边产品诸如Hive可以与HBase相结合使在HBase进行数据统计处理变得简单,Sqoop为HBase提供了方便的RDBMS数据导入功能,使传统数据库的数据向HBase中迁移变得容易,Spark等高性能的内存分布式计算引擎也可能帮助我们更加快速的对HBase中的数据进行处理分析。
大数据的水很深,但是范围适中。初学者都是扎根于Hadoop的生态圈,HBase是必学技能之一
为什么选择HBase?而不是Mysql或者Oracle
当我们开始学习一门技术的时候总是习惯于将它们与已有的技术进行对比。当我们刚接触python的时候会发现它的简洁与效率,当我们刚接触php的时候也会探寻为啥它是最好的语言没有之一。。。
那么HBase经常会和常见的关系型数据库进行对比:
HBase | Mysql or Oracle |
---|---|
列式,Nosql数据库 | 行式,关系型数据库 |
只支持byte[]类型 | 支持多种数据类型 |
支持海量数据存储 | 支持大量数据存储 |
只支持基于rowkey的索引 | 支持 |
每秒百万查询吞吐量 | 每秒数千查询吞吐量 |
事务只支持到row级别 | 完整的事务 |
适合时间序列或者随机查询 | 适合复杂查询,多表关联等 |
数据维护形式单一,更新支持多个版本存在 | 数据增删改查非常方便,直接修改原有数据 |
其实两者的对比毫无意义,因为两者适用于不同的场景
HBase作为一个NoSQL,不支持完整的事务性,而且仅仅支持基于RowKey的索引,在性能上不如memcached和redis。但是在海量数据,持久化存储方便比内存类型的NoSQL强的多,作为文档型NoSQL在分布式存储上比mongoDB做切分和MapReduce分析也简单方便的多。这一切都源于HBase本身基于Hadoop,可以简单的通过增加廉价节点的方式进行扩展,对于数据本身就可以很好的进行水平切分,同时和HDFS,MapReduce,Spark等结合的很好。不仅可以方便的进行存储同时可以更加方便的对数据进行处理和运算,这才是HBase最核心的特性。这些都是常见的关系型数据库无法比拟的。比其他常见的NoSQL也要强出不少。
当然,HBase并不能解决所有的问题,所以才会有那么多的NoSQL和SQL
HBase典型的应用场景就是不断的插入新的信息。对于持续的大量的插入可以达到每秒百万的吞吐量。对于已有的数据修改的频率是很小的。
Google用自己的BigTable存储互联网上新生成的网页,Facebook的messenger是基于HBase实现的。
举个栗子
在大数据相关的应用之中,假设你要存储用户的地址和喜好。这些当然可以存储到关系型数据库之中,但是假设用户从上海搬到了北京。那么之前上海的地址就要update覆盖掉吗?这种应用场景下,我们需要计算分析用户的整个人生周期的活动记录和喜好,进而推测他的行为,收入,知识层次,信用等等。这些历史行为是不能被丢弃的,所以HBase可以很好的适应这样的场景。
摘自知乎:《HBase为什么火?它适用于哪些业务场景》中向磊的回答。
对于海量小文件存储HBase也是非常适合的。对比于支持文档型数据存储的MongoDB,HBase写优先于随机读,MongoDB的写性能不如读性能。两者虽然都支持MapReduce但是HBase对MapReduce的支持更好,同时HBase本身就支持水平切分,在数据分片上也有很大的优势。同时HBase本身就支持多个版本,对于多版本的数据存储也很方便。Mongo对于复杂查询支持较好,但是我们HBase也有Phoenix。
HBase很厉害,我要用HBase!!!
欢迎大家学习我的实战课程《HBase+SpringBoot实战分布式文件存储》,全面了解HBase,更好的使用HBase。