介绍
HBase是一种NoSQL数据库。NoSQL所表示的意思是区分于传统的RDBMS-关系型数据库,它不支持关系型数据库的SQL语言。现在,有很多的NoSQL类型数据库,例如BerkeleyDB是一个本地的NoSQL数据库,而HBase则是一个分布式的NoSQL数据库。谈到数据库,其实HBase更像是一个数据存储,因为它不支持数据库的多种特点,比如SQL,比如二级索引、触发器、高级搜索语言等;但是HBase也有自己的很多特性,它可以进行线性和模块化扩展;HBase集群的扩展是通过扩展RegionServer来实现的,RegionServer则是运行在一组服务器上。如果一个HBase集群从10个扩展到20个,那么集群的存储空间和计算能力都会翻番;关系型数据库也能很好的扩展,但是仅仅是在 一个点上的纵向扩展,通过扩展硬件的计算、存储和内存来达到服务的升级;HBase有以下特性:
- 强一致性读写:HBase不是最终一致性的数据库,所以一些计数器在HBase中实现非常合适;
- 自动分片策略:HBase的表通过分区(regions)分布在集群中,分区(regions)则会自动的随着数据增长重新分割并重新分布;
- 自动分区服务容错;
- Hadoop/HDFS集成:HBase底层支持直接使用HDFS进行存储,因为HDFS是一个分布式存储系统;
- MapReduce:HBase支持使用HBase作为并行的MapReduce作业的数据源;
- Java Client API:HBase支持非常简单的Java API 接口;
- Thrift/REST API:HBase也支持Thrift或Rest API;
- Block Cache and Bloom Filters: HBase支持分块缓存和bloom filters来实现快速检索;
- 运行管理:HBase提供和JMX一样的内置web页面来观察服务的情况;
什么时候使用HBase
- 当你有数亿或者数十亿的记录需要存储时,可以选择使用HBase;当你只有几千到一百万行数据时,传统的关系型数据库可能更合适;
- 确保你可以放弃关系型数据库提供的特性;
- 确保你有足够的硬件,即使对于HDFS来说,少于5个节点的集群的效率也不会很好;
HDFS和HBase的区别
HDFS是一个被设计用来存储大文件的文件系统,它无法提供单个独立记录的快速查找;HBase是建立在HDFS基础上的,提供数据在巨大的数据表中的快速查找、更新;HBase内部将数据存储在索引后的数据文件中,这些数据文件被保存到了HDFS中。
Catalog Tables
HBase的目录表:hbase:meta会被HBase的shell命令:list过滤,list命令不会显示出它,但是它确实是实际存在的一个独立的表;
-ROOT-
-ROOT-表从0.96开始已经被移除了。
-ROOT-表用来追踪.META表的的位置(.META是hbase:meta的之前的旧名字)-到0.96版本
-ROOT-表的结构如下:
- KEY
- .META. region key (
.META.,,1
) - VALUE
- info:regininfo(序列化的HRegionInfo,hbase:meta实例)
- info:server(拥有hbase:meta的服务器server:port)
- info:serverstartcode(拥有hbase:meta的服务器进程的启动时间)
hbase:meta
hbase:meta保存了一个系统分区的列表,这个列表之前是通过-ROOT-来追踪定位的,现在它保存到了Zookeeper上;它的结构如下:
- KEY
- 分区主键([table],[region start key],[region id])
- VALUES
- info:regininfo(region的序列化的HRegionInfo实例)
- info:server(regionServer的server:port)
- info:serverstartcode(regionServer进程的启动时间)
HRegionInfo说明:
HRegionInfo中的空白key用来标识table的开始和结束;如果一个region start key为空,则标识它是一个表的开始第一个分区;如果start key和end key都为空,则该分区是该表的唯一分区;
启动排序
首先,hbase:meta信息是从zookeeper上进行查找的,另外,hbase:meta会根据服务器地址和启动时间进行更新;
Client和ClientFilters以后的blog再总结
Master(主节点)
HMaster是MasterServer的实现,MasterServer负责监控集群中所有RegionServer节点,也是所有元数据变化的接口;在一个分布式集群中,MasterServer实际上是运行在一个NameNode上。
启动行为
如果运行在一个多主服务的集群上,所有的主服务都会启动完毕准备操作整个集群。当当前活动的主节点丢失时(可能是丢失到zookeeper的连接或重启),另外一个闲置的主节点就会马上接管整个集群;
运行时的影响
一个经常被提及的问题是,当单master节点的集群中,master down机会产生什么影响?因为所有的regionServer节点都与master节点直接通信,结果是down机后整个集群会处在一个相对稳定的状态;因为保存hbase:meta表数据不存在master节点上,而是在zookeeper上,但是Master控制了所有regionServer的故障转移以及数据分割,因此Master应该尽快的被启动起来;
接口
HMasterInterface暴露的接口主要是面向元数据的:
- 表操作 (createTable, modifyTable, removeTable, enable, disable)
- 列族 (addColumn, modifyColumn, removeColumn)
- 分区Region (move, assign, unassign)
进程
Master运行了几个后台线程;
- LoadBalancer(负载均衡)
- 定时或当所有region都没有请求时,LoadBalancer会启动,移动Region来实现集群的负载均衡;
- CatalogJanitor(目录看管)
- 定时检查并清理hbase:meta表中的数据;
RegionServer
HRegionServer是RegionServer的实现;负责服务和维护分区(regions);RegionServer运行在DataNode上。
接口
HRegionRegionInterface暴露出的接口是面向分区维护和数据维护的:
- 数据(get, put, delete, next, 等等.)
- 分区 (splitRegion, compactRegion, 等.)
进程
RegionServer运行了不同种类的后台线程:
- CompactSplitThread
- 检查数据分割,负责小型数据合并(minor compaction)
- MajorCompactionChecker
- 大型数据合并的检查
- MemStoreFlusher
- 定时将内存中的数据写到文件存储中;
- LogRoller
- 定时检查RegionServer的HLog
Coprocessors
在0.92版本被添加进来;更多信息可以参考Blog Overview of CoProcessors
Block Cache
HBase提供了三种不同的块缓存,分别是使用堆实现的LruBlockCache,以及非堆实现的BucketCache, SlabCache;
- 缓存的选择
- LruBlockCache是块缓存的原始实现,它完全在java堆中。BucketCache和SlabCache被设计用来在堆外存储数据的,当然也可以保存到堆或者文件中;注意,SlabCache现在不被推荐,并且要在1.0.0版本移除;
- BucketCache是更多产品化部署的首选并且有更多的配置项;相对于堆内实现的LruBlockCache,BucketCache可能会在读取数据时稍慢,但是相比较堆内的GC次数更少,BucketCache因此会更稳定;
- 一些证据表明BucketCache比SlabCache有更少的GC次数,因此BucketCache会更稳定;之所以说SlabCache有更多的垃圾回收次数,原因是在SlabCache中,数据会从L1移动到L2,也就是激活了SlabCache配置,等于是激活了一个两层缓存系统;它的实现类是:DoubleBlockCache,当一个数据从L1中消失时,会被移动到L2层;
- 而BucketCache 的实现类是:CombinedBlockCache。所有的数据块都被保存到了BucketCache,而元数据块,例如索引和Bloom数据块都被保存到了LruBlockCache;
Write Ahead Log (WAL)
写前日志WAL记录了所有的HBase的数据变动,并存储到磁盘文件中;WAL之所以会有价值,是因为数据是定时从内存存储写入到文件中的,当写入操作未完成但是RegionServer却down机时,WAL保证这些数据可以被重新读取;如果写入WAL失败,整个写入将会返回失败;
HBase使用HLog来实现保存WAL。一般每个RegionServer实例只有一个WAL实例,在写入MemStore之前,HBase会先将日志写入WAL。
WAL在HDFS中的目录位于每个regionserver子目录下的/hbase/WALs;
没有评论:
发表评论