HBase
HBase的起源
HBase的原型是Google的BigTable论文,受到了该论文思想的启发,目前作为Hadoop的子项目来开发维护,BigTable是一个管理结构化数据的分布式存储系统,它可以扩展到非常大:如在成千上万的商用服务器上存储PB级的数据..…一个稀疏的、分布式的、持久的多维排序映射。
官方网站:http://hbase.apache.org
-- 2006 年 Google 发表 BigTable ***
-- 2006 年开始开发 HBase
-- 2008 年北京成功开奥运会,程序员默默地将 HBase 弄成了 Hadoop 的子项目
-- 2010 年 HBase 成为 Apache 顶级项目
-- 现在很多公司二次开发出了很多发行版本,你也开始使用了
HBase的架构
Zookeeper
功能:
1)监控RegionServer,将RegionServer的上线和下线信息实时通知给HMaster
2)记录root表存储的位置,ROOT找到META表位置,META表中的信息确定用户数据存放的位置(region);
3)实现HMaster的高可用
HMaster
1)为RegionServer分配Region,故障转移等
2)负责RegionServer的负载均衡
RegionServer
功能:
1)维护Region,处理对这些Region的IO请求
2)负责切分在运行过程中变大的Region
3)BlockCache读缓存,memstore写缓存
4)HLog记录数据的变更信息,用来做数据恢复
组件:
1)Write-Ahead logs
HBase 的修改记录,当对HBase读写数据的时候,数据不是直接写进磁盘,它会在内存中保留一段时间(时间以及数据量阈值可以设定)。但把数据保存在内存中可能有更高的概率引起数据丢失,为了解决这个问题,数据会先写到一个叫做Write-Ahead logfile的文件中,然后再写入内存中,所以在系统出现故障的时候,数据可以通过这个日志文件重建。
2)HFile
这是在磁盘上保存原始数据的实际物理文件,是实际的存储文件。
3)Store
HFile存储在Store中,一个Store对应HBase表中的一个列族。
4)MemStore
顾名思义,就是内存存储,位于内存中,用来保存当前的数据操作,所以当数据保存在WAL中之后,,RegionServer会在内存中存储键值对。
5)Region
Hbase表中的分片,HBase表中会根据RowKey值被切分成不同的region存储在RegionServer中,在一个RegionServer中可以有多个不同的region。
HBase一种是作为存储的分布式文件系统,另一种是作为数据处理模型的MR框架。因为日常开发人员比较熟练的是结构化数据进行处理,但是在HDFS直接存储的文件往往不具有结构化,所以催生出了HBase在HDFS上的操作,如果需要查询数据,只需要通过键值便可以成功访问。
架构图如下图所示:
HBase 内置有 Zookeeper,但一般我们会有其他的 Zookeeper 集群来监管 master 和
regionserver,Zookeeper 通过选举,保证任何时候,集群中只有一个活跃的 HMaster,HMaster与 HRegionServer 启动时会向 ZooKeeper 注册,存储所有 HRegion 的寻址入口,实时监控HRegionserver 的上线和下线信息。并实时通知给 HMaster,存储 HBase 的 schema 和 table元数据,默认情况下,HBase 管理 ZooKeeper 实例,Zookeeper 的引入使得 HMaster 不再是单点故障。一般情况下会启动两个 HMaster,非 Active 的 HMaster 会定期的和 Active HMaster通信以获取其最新状态,从而保证它是实时更新的,因而如果启动了多个 HMaster 反而增加了 Active HMaster 的负担。
一个 RegionServer 可以包含多个 HRegion,每个 RegionServer 维护一个 HLog,和多个 HFiles
以及其对应的 MemStore。RegionServer 运行于 DataNode 上,数量可以与 DataNode 数量一致,
请参考如下架构图:
自动分区
HBase中扩展和负载均衡的基本单元称为region,region本质上是以行键排序的连续存循的区间。如果region 太天,示统就会把它们动态拆分,相反地,就把多个region合并,以减少存储文件数量。
HBase中的region等同于数据库分区中用的范围划分(range partition)。它们可以被分配到若干台物理服务器上以均摊负载,因此提供了较强的扩展性。一张表初始的时候只有一个region,用户开始向表中插入数据时,系统会检查这个region的大小,确保其不超过配置的最大值。如果超过了限制,系统会在中间键(middle key,region中间的那个行键)处将这个region拆分成两个大致相等的子region每一个region只能由一台region服务器(region server)加载,每一台region服务器可以同时加载多个region。图中展示了一个表,这个表实际上是一个由很多region服务器加载的region集合的逻辑视图。
region 拆分和服务相当于其他系统提供的自动分区(autosharding)。当一个服务器出现故障后,该服务器上的region可以快速恢复,并获得细粒度的负载均衡,因为当服务于某个region的服务器当前负载过大、发生错误或者被停止使用导致不可用时,系统会将该region移到其他服务器上。
region拆分的操作也非常快接近瞬间,因为拆分之后的region读取的仍然是原存储文件,直到合并把存储文件异步地写成独立的文件。