本文主要讨论这几个问题:
- 什么是HBase
- HBase的特点
- HBase的适用场景
- HBase的缺点
1. 什么是HBase
HBase是参考Google BigTable模型的开源实现,HBase是:
Java开发的、
非关系型的、
列存储(同时也可称为是KV键值存储的)、
持久化的、
构建于Hadoop分布式文件系统(HDFS)之上的(默认,也可构建在符合接口的其他文件系统之上)、
强一致性的(CP),
高可靠的(HBase是通过底层HDFS的副本机制实现数据的冗余存储及高可靠性)、
高性能的(HBase具有近似最优的写性能(能使I/O利用率达到饱和),以及较出色的读性能)、
开源分布式数据库(NoSQL)。
2. HBase的特点
- 面向列:
- 按列存储,因为相同的列都是近似的数据,更适合压缩,适合加载后进行分析等需求。在查询只需要少量列字段的时候,可以避免加载无用列数据,减少IO。
- 稀疏性:
- 列数据为空的可以在实际存储时不存NULL值占位,即为空的列不占用存储空间。
- 数据多版本:
- 单元格(table, rowkey, column-family, column, timestamp)可以保存多个版本的值,由时间戳(timestamp)来区分
- 灵活模式:
- 创建表时只需要指定表名和列族,不需要定义列。因此可以在写入时动态创建列,并且存储的稀疏性,每行的列都可以不同。
- 可以存储结构化、半结构化和非结构化数据
- 压缩:
- 支持指定列族压缩,以及选择压缩算法
- 单行操作原子性:
- 无锁CAS操作
- 读/写强一致性:
- 表中每行数据只会存在一个Region(即只会存在一台Region Server服务器)上,并且读写都只在这一个region上,不会同时也在副本上进行。
- 扩展性:
- 数据自动分区(表按Region进行拆分,一个Region保存了一段rowkey范围的行数据)
- 负载均衡(Region会自动分割,可以重新分配迁移到其他Region Server服务器上)
- 因此可以通过增加机器(region server)的方式扩展集群。
- 高可靠:
- 多副本(依靠HDFS提供的副本和自动故障转移机制)
- WAL(预写日志)
- 高性能:
- 近似最优的写性能(得益于底层的LSM数据结构,按Rowkey有序存储)
- 优秀的读性能(通过使用BloomFilter,使得按rowkey的检索理想情况下常数级别时间复杂度,Region的拆分和负载均衡可以提供读负载,以及缓存机制可加速数据获取)
- 与Hadoop平台结合紧密
- 底层存储可以基于Hadoop HDFS
- 可以结合MapReduce计算框架(HBase可以作为source和sink)
- 可以结合Hive(HBase表映射到Hive)
- 多种client接口
- Java client driver
- Thrift协议接口
- REST接口(HTTP)
3. HBase适用场景
- 海量数据存储
- 中小对象存储
- 高性能写入需求
- 按键检索,按键范围扫描
- 数据分析(并且可以结合Hadoop MapReduce等进行计算)。
4. HBase缺点
- 不支持跨行事务
- 原生不支持二级索引(有其他方案构建二级索引,但很麻烦,功能也不完善)
- 原生不支持SQL查询(可以通过Phoenix,但是有很多限制以及性能问题)
- Java编写,GC问题导致的卡顿
- 除按键检索,按键范围扫描外,不支持复杂查询。不支持排序(只能从rowkey上设计,按rowkey顺序)
/* 本文属于原创文章,转载请注明作者和出处 quarterback.cn,请勿用于任何商业用途 */