分布式数据库HBase
概述
HBase是针对谷歌BigTable的开源实现,是一个高可靠、高性能、面向列、可伸缩的分布式数据库。主要用来存储非结构化和半结构化的松散数据。HBase可以支持超过打过莫数据存储,他可以通过水平式扩展的方式,利用廉价计算机集群处理由超过10亿行数据和数百万列元素组成的数据表。
简介
HBase利用Hadoop MapReduce来处理HBase中的海量数据,实现高性能计算;利用Zookeeper作为协同服务,实现稳定服务和失败恢复;使用HDFS作为高可靠的底层存储,利用廉价集群提供海量数据存储能力。HBase也可以直接使用本地文件系统而不用HDFS作为底层数据存储方式,不过一般为了发挥HBase处理大数据功能和提高数据可靠性和系统的健壮性,一般都是用HDFS作为HBase的底层数据存储方式。此外,为了方便在HBase上进行数据处理,Sqoop为HBase提供了高效、边界的RDBMS数据导入功能,Pig和Hive为HBase提供了高层语言支持。
HBase和BigTable的底层技术对应关系 | ||
项目 | HBase | BigTable |
文件存储系统 | HDFS | GFS |
海量数据处理 | Hadoop MapReduce | MapReduce |
协同服务管理 | Zookeeper | Chubby |
HBase和传统关系数据库的对比分析
HBase等非关系型数据库弥补了传统的关系型数据库的缺陷,无论是在数据高并发还是高可扩展性和高可用性方面,HBase都占据优势。主要区别有以下几点:
数据类型差异。传统的关系型数据库采用关系模型,HBase则采用了更简单的数据模型,它把数据存储为未经届时的字符串,用户可以把不同格式的结构化数据和非结构化数据都序列化成字符串,保存到HBase中,用户需要自己编写程序把字符串解析成不同的数据类型(最后还是会保存到关系型数据库中,HBase只保存数据分析的结果,最后的数据还是会转换成关系型数据库中)。
数据操作。关系型数据库基本的curd操作,其中会涉及到复杂的多表链接,通常是借助于多个表之间的主外键关联实现(数据耦合性很大)。HBase操作则不存在复杂的表与表之间的关系,只有简单的插入、删除、查询、清空等。HBase在设计上就避免了复杂的表和表之间的关系,通常只采用单标的主键查询,所以避免了传统关系型数据库表和表之间的连接操作(减少了数据表的耦合)。
存储模式。关系型数据库采用行模式存储的,元组或行会被连续的存储在磁盘页中,需要顺序进行扫描查询,基于行模式存储就会浪费许多磁盘空间和内存带宽。而HBase是基于列存储的,每个列族都有几个文件保存,不同列族的文件是分离的,它可以降低I/O开销,支持大量并发用户查询,因为仅需要处理可以回答这些查询的列,而不需要处理与查询无关的大量数据行;同一个列族中的数据会被一起进行压缩,由于同一列族内的数据相似度较高,因此,可以获得较高的数据压缩比。
数据索引。关系型数据库通常可以针对不同列构建复杂的多个索引,以提高数据访问性能。HBase只有一个索引(行健),通过行健访问或者行健扫描,基于Hadoop MapReduce来快速高效的生成索引表。
数据维护。HBase更新操作会保留旧版本数据。而关系型数据库则是直接覆盖掉。
可伸缩性。可以利用廉价硬件来换取数据存储的伸缩性和可扩展性。
Hbase存储框架
HBase中的每张表都通过行键按照一定的范围被分割成多个子表(HRegion),默认一个HRegion超过256M就要被分割成两个,由HRegionServer管理,管理哪些HRegion由HMaster分配。
HRegionServer存取一个子表时,会创建一个HRegion对象,然后对表的每个列族(Column Family)创建一个Store实例,每个Store都会有0个或多个StoreFile与之对应,每个StoreFile都会对应一个HFile, HFile就是实际的存储文件。因此,一个HRegion有多少个列族就有多少个Store。
另外,每个HRegion还拥有一个MemStore实例。
HBase是基于BigTable的面向列的分布式存储系统,其存储设计是基于Memtable /SSTable设计的,主要分为两部分,一部分为内存中的MemStore (Memtable),另外一部分为磁盘(这里是HDFS)上的HFile(SSTable)。还有就是存储WAL的log,主要实现类为HLog.
MemStore
MemStore源码:private final ConcurrentNavigableMap<KeyValue, KeyValue>delegatee;
本质上MemStore就是一个内存里放着一个保存KEY/VALUE的MAP,当MemStore(默认64MB)写满之后,会开始刷磁盘操作。