HBase简介
HBase是Apache下Hadoop项目的子项目,是Hadoop Database的简称,来源于Google的BigTable(BigTable是将所有的字段放到一个大表中,造成了数据的冗余,但是效率有效地提高了),本质实际上是一张稀疏的大表,用来存储粗粒度的结构化数据,并且能够通过简单的增加节点来实现系统的线性扩展,HBase是建立在HDFS之上的高可靠性、高性能、面向列、可伸缩的分布式存储系统,利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群。
HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库,HBase基于列的而不是基于行的模式,HBase每个列属于一个特定的列族,通过行和列来确定一个存储单元,而每个存储单元又可以有多个版本,通过时间戳来标识
列式存储
列式存储与行存储区别
- 写入方面,行存储的写入是一次完成的,建立在操作系统的文件系统上,保证写入过程的成功与失败;列存储是把一行数据拆分成单列保存,写入次数更多,所以写入时间消耗会更大
- 读取方面,行存储通常也是以行来进行读取,通常是读取一整行;列存储每次读取是数据集合的一段或者全部
系统架构
Client
Client包含了访问Hbase的接口,另外Client还维护了对应的cache来加速HBase的访问,比如cache的.META.元数据的信息。
Zookeeper
HBase通过Zookeeper来做master的高可用、RegionServer的监控、元数据的入口以及集群配置的维护等工作。具体工作如下:
通过Zoopkeeper来保证集群中只有1个master在运行,如果master异常,会通过竞争机制产生新的master提供服务
通过Zoopkeeper来监控RegionServer的状态,当RegionSevrer有异常的时候,通过回调的形式通知Master RegionServer上下线的信息
通过Zoopkeeper存储元数据的统一入口地址
两大角色
HBase集群中通常包含两种角色,HMaster和HRegionServer,当表随着记录条数的增加而不断变大后,将会分裂成一个个region,每个region可以由[startkey,endkey)来表示,它包含一个startkey到endkey的半闭区间。一个HRegionServer可以管理多个region,并由HMaster来负责HRegionServer的调度以及集群状态的监管。由于region可分散由不同的HRegionServer来管理,因此理论上再大的表都可以通过集群来处理
HMaster
HMaster节点负责HRegionServer的调度以及集群状态的监管,主要职责如下:
- 监控RegionServer,并处理RegionServer故障转移
- 为RegionServer分配Region
- 维护整个集群的负载均衡
- 维护集群的元数据信息
- 发现失效的Region,并将失效的Region分配到正常的RegionServer上
- 当RegionSever失效的时候,协调对应HLog的拆分
HRegionServer
HRegionServer直接对接用户的读写请求,是真正的“干活”的节点,用来管理多个region。它的功能概括如下:
- 负责存储HBase的实际数据
- 管理master为其分配的Region
- 处理来自客户端的读写请求
- 负责和底层HDFS的交互,存储数据到HDFS
- 负责Region变大以后的拆分以及分片操作
- 负责Storefile的合并工作
- 维护HLog
- 执行压缩
HDFS
HDFS为HBase提供最终的底层数据存储服务,同时为HBase提供高可用(HLog存储在HDFS)的支持,具体功能概括如下:
- 提供元数据和表数据的底层分布式存储服务
- 数据多副本,保证的高可靠和高可用性
Write-Ahead logs(HLog)
HBase的修改记录,当对HBase读写数据的时候,数据不是直接写进磁盘,它会在内存中保留一段时间(时间以及数据量阈值可以设定)。但把数据保存在内存中可能有更高的概率引起数据丢失,为了解决这个问题,数据会先写在一个叫做Write-Ahead logfile的文件中,然后再写入内存中。所以在系统出现故障的时候,数据可以通过这个日志文件重建。
Region
HBase表的分片,HBase表会根据RowKey值被切分成不同的region,存储在HRegionServer中,在一个HRegionServer中可以有多个不同的region。
当表随着记录条数增加而不断变大后,将会分裂成一个个region,每个region可以由[startKey,endKey)来表示
Store
HFile存储在Store中,一个Store对应HBase表中的一个列族。
store包括位于内存中的memstore和位于磁盘中的storefile。写操作先写入memstore,当memstore中的数据达到某个阈值,HRegionServer会启动flashcache进程写入storefile,每次写入形成单独的一个storefile。
当storefile文件的数量增长到一定阈值时,系统会进行合并,在合并过程中会进行版本合并和删除工作,生成更大的storefile。
当一个region所有storefile的大小和超过一定阈值后,会把当前的region分割为两个,并由Hmaster分配到相应的regionServer服务器,实现负载均衡。
在客户端检索时,先在memstore找,找不到的话会查询storefile
MemStore
内存存储,位于内存中,用来保存当前的数据操作,所以当数据保存在WAL中之后,RegsionServer会在内存中存储键值对。
StoreFile
这是在磁盘上保存原始数据的实际的物理文件,是实际的存储文件。StoreFile是以HFile的形式存储在HDFS的。
特点
海量存储
Hbase适合存储PB级别的海量数据,在PB级别的数据以及采用廉价PC存储的情况下,能在几十到百毫秒内返回数据。
列式存储
这里的列式存储其实说的是列族存储,Hbase是根据列族来存储数据的。每个列族下面可以有非常多的列,列族在创建表的时候就必须指定。
极易扩展
Hbase的扩展性主要体现在两个方面,一个是基于上层处理能力(RegionServer)的扩展,一个是基于存储的扩展(HDFS)。
通过横向添加RegionSever的机器,进行水平扩展,提升Hbase上层的处理能力,提升Hbsae服务更多Region的能力。
RegionServer的作用是管理region、承接业务的访问,这个后面会详细的介绍通过横向添加Datanode的机器,进行存储层扩容,提升Hbase的数据存储能力和提升后端存储的读写能力。
高并发
由于目前大部分使用Hbase的架构,都是采用的廉价PC,因此单个IO的延迟其实并不小,一般在几十到上百ms之间。这里说的高并发,主要是在并发的情况下,Hbase的单个IO延迟下降并不多,能获得高并发、低延迟的服务。
稀疏
稀疏主要是针对Hbase列的灵活性,在列族中,你可以指定任意多的列,在列数据为空的情况下,是不会占用存储空间的。