HBase简介
-
HBase的原型是Google的BigTable论文,受到了该论文思想的启发,目前作为Hadoop的子项目来开发维护,用于支持结构化的数据存储
-
HBase是Google Bigtable的开源实现,但是也有很多不同之处。比如:Google Bigtable利用GFS作为其文件存储系统,HBase利用Hadoop HDFS作为其文件存储系统;Google运行MAPREDUCE来处理Bigtable中的海量数据,HBase同样利用Hadoop MapReduce来处理HBase中的海量数据;Google Bigtable利用Chubby作为协同服务,HBase利用Zookeeper作为对应。
-
海量存储
Hbase适合存储PB级别的海量数据,在PB级别的数据以及采用廉价PC存储的情况下,能在十几到百毫秒内返回数据。这与Hbase的极易扩展性息息相关。正是因为Hbase良好的扩展性,才为海量数据的存储提供了便利。 -
列式存储
列式存储其实就是列族存储,Hbase是根据列族来存储数据的,列族下面可以有非常多的列,列族在创建表的时候就必须指定。 -
极易扩展
Hbase的扩展性主要体现在两个方面。一个是基于上层处理能力(RegionServer)的扩展,一个是基于存储的扩展(HDFS)。通过横向添加RegionServer的机器,进行水平扩展,提升Hbase上层的处理能力,提升Hbase服务更多Region的能力。
-
高并发
由于大部分使用Hbase的架构,都采用廉价的PC,因此单个IO的延迟其实并不小,一般在几十到上百ms之间。这里说的高并发,主要在并发的情况下,Hbase的单个IO延迟下降并不多。能获得高并发,低延迟的服务。
为什么要使用HBase
- 查询信息时会产生缓存,之后再次查询不需要再访问数据库
- 缓存的数据如何更新:CUD操作,直接清除缓存,更新缓存(缓存工作于内存中)
- Hbase是一个高可靠性、高性能、面向列、可伸缩、实时读写的分布式数据库
- 利用Hadoop HDFS作为其文件存储系统,利用Hadoop MapReduce来处理Hbase中的海量数据,利用Zookeeper作为其分布式协同服务。
体系架构
-
Client
- 包含访问Hbase的接口并维护cache来加快对Hbase的访问Zookeeper
- 保证任何时候,集群中只有一个master
- 贮存所有Region的寻址入口
- 实时监控RegionServer的上线和下线信息,并实时通知Mster
- 存储Hbase的schema和table元数据
-
Master ==namenode
- 为RegionServer分配region
- 负责RegionServer的负载均衡
- 发现失效的RegionServer并重新分配其他的region
- 管理用户对table的增删改操作
-
RegionServer==datanode
- RegionServer维护region,处理对这些region的IO请求
- RegionServer负责切分在运行过程中变得过大的region
-
Region
- Hbase自动把表水平划分成多个区域(region),每个region会保存一个表里面某段连续的数据,每个表一开始只有一个region,随着数据不断插入表,region不断增大,当增大到一个阈值的时候,region就会等分为两个新的gerion(!!!裂变!!!)
- 当table中的行不断增多,就会有越来越多的region,这样一张完整的表被保存在多个RegionServer上
-
MemStore与StoreFile
- 一个region由多个store组成,一个store对应一个CF(列族)
- store包括位于内存中的MemStore和位于磁盘的StoreFile写操作
- 当MemStore中的数据达到某个阈值,HregionServer会启动FlushCache进程写入StoreFile,每次写入形成单独的一个StoreFile(强制写道文件上;flush表名)
- 当StoreFile文件的数量增长到一定阈值后,系统会进行合并(minor major compaction),在合并过程中会进行版本合并和删除工作(majar),形成更大的StoreFile
- 当一个Region所有StoreFile的大小和数量超过一定阈值后,会把当前的Region分割为两个,并由Hmaster分配到相应的RegionServer服务器,实现负载均衡
- 客户端检索数据,先在MemStore找,找不到再找StoreFile
-
HRegion是Hbase中分布式存储和负载均衡的最小单元,最小单元就表示不同的HRegion可以分布在不同的HRegionServer上
-
HReion由一个或者多个Store组成,每个Store保存一个Columns Family
-
每个Store又由一个MemStore和0至多个StoreFile组成