HBase是什么
HBase是一个分布式的、面向列的开源数据库,它是Apache的Hadoop的子项目,不同于一般的关系型数据库,它是一个适合于非结构化数据存储的数据库,此外HBase是基于列存储的而不是基于行的。
HBase的特点
1.海量的数据存储
HBase的单表可以有百亿行,百万列,数据矩阵横向和纵向这两个维度所支持的数据量都非常的具有弹性
2.面向列
HBase是面向列的存储和权限控制,并支持独立检索,列式存储,其数据是按照某列存储的,这样在查询只需要少数几个字段的时候,能大大的减少读取数据量
3.多版本
HBase的每一列的存储有多个版本
4.稀疏行
为空的列并不占据存储空间,表可以设计的非常的稀疏
5.扩展行
底层依赖于HDFS,不够存储的时候只需要增加节点就可以了
6.高可靠
WAL机制保证了数据在写入时候,不会因为集群异常导致写入数据丢失,因为存在Replication机制,它保证了集群在在出现严重问题的时候数据不会发生丢失或者损坏,并且HBase的底层使用hdfs存储,它自己也是有备份的。
7.高性能
底层的LSM数据结构(我也不太明白这个东西)和RowKey有序排列等架构上的独特设计,使得HBase具有非常高的写入性能。region切分、主键索引和缓存机制使得HBase在海量数据下具备一定的随机读取性能,该性能针对Rowkey的查询能达到毫秒级。
HBase的架构
HBase自己的服务有Master和RegionServer,依赖的服务有HDFS和zookeeper。Master的主要工作是管理RegionServer,全局管理调控HBase的服务,它也可以从ZK上获取RegionServer的运行情况。RegionServer类似于hdfs上的datanode,用于管理HBase中的数据,它是region的一个服务,region是HBase中的数据存储单元,当我们表中的数据量很大的时候hbase就会对表进行分区,每一个分区就是一个region,每一个region就管理自己的数据,而RegionServer就是管理这些region的,并且定时的向Master汇报自己的健康情况和管理的region,同时它也将这些信息发送给ZK。
HBase的表结构(这部分的内容,需要实际的去操作表,就会对表结构有一个全面的认识)
row key | datainfo | savepath | timestamp |
---|---|---|---|
t1 | name:file1.txt,type:txt,size:1024 | path: /home/path | 1546425461 |
t2 | name:file2.jpg,type:jps,size:2048 | path: /home/path | 1546425461 |
表结构如上所示,HBase的表结构由rowkey、时间戳和列簇组成,在创建表的时候指定表名和列簇即可,需要注意的是列簇一般不会超过5个,每个列簇中的列不会有限制,列只有在插入数据以后才会存在并且是有序的。rowkey是唯一的它相当于关系型数据库的主键。上表中datainfo和savepath为这个表的列簇,datainfo的列簇下有三列,name,type和size,savepath下有一列path。
HBase和关系型数据库的比较
1.列动态增加
2.数据自动切分
3.高并发读写
4.不支持条件查询
HBase基础架构(三大模块)
1.HMaster
HBase的中央节点,将region分配给RegionServer,协调RegionServer的负载并维护集群的状态,维护表和region的元数据,不参与数据的读写操作。HBase支持Ha,也就是说可以同时支持多个master运行但是只能有一个master处于active状态,如果处于active的的master出现了故障,其他的master节点就会选举出一个master节点来管理集群。
2.RegionServer
维护master交给它的region,处理对这些region的IO请求,负责切分正在运行过程中变大的region
3.Zookeeper
它是集群的协调器,通过ZK保证了HMaster有一个是处于active状态的,保存这HBase的集群信息,向中央节点提供HBase RegionSever的信息。
HBase的模块协作工作
1.当HBase启动的时候,HMaster启动,注册到ZK,等待RegionServer的汇报,RegionServer启动注册到ZK,并向HMaster汇报,HMaster对各个RegionServer(包括失效的节点)的数据进行整理,分配RegionServer和meta的信息。
2.RegionServer失效以后,ZK会将失效的这个情况汇报给HMaster,并且他们之间也存在心跳检测,HMaster一旦收到这个情况信息以后就会将对应节点的数据分配给其他的节点去处理然后更新失效节点在meta中的信息。
3.HMaster失效
这个分成两中情况,第一种情况是配置了HA的,此时其他的backup的HMaster会通过竞争机制选出一个HMaster作为active状态的HMaster来管理HBase集群
另外一种情况就是没配置HA,此时HMaset并不能正常工作,集群中只能读写数据,并不能创建删除表,也不能更改表结构,应为这些操作会需要HMaster的参与但是HMaster并不能正常工作。
HBase的读写过程
写过程
RegionSever管理着多个region,并且每个RegionServer都有对应的HLog实例,region是HBase最基本的存储单元,存放真正的数据,每一个region直存储一个Column family的数据,而且只是这个列簇的一部分,当region的大小达到一定的阈值的时候,会根据rowkey的排序划分为多个region,而且每个region中会包含多个store对象,每一个store中包含一个MemStore和一个或者多个StoreFile,MemStore便是数据在内存中的实体,并且一般是有序的,当有数据写入的时候写写入到MemStore,当MemStore的大小达到一定的阈值时store就会创建StoreFile,SotreFile是HFile的一层封装。所以HBase的数据最终都是写入到hdfs上 的。
HLog是WAL的一种实现,WAL是一种预写日志,是事物机制中常见的一致性的是实现方式,每一个RegionServer都有一个HLog实例,RegionServer会将更新操作记录到MemStore,然后更新到HLog中,只有当HLog更新完成这条记录才算真正的写入,这样即使MemStore中的数据丢失了也可以通过HLog找回,但是,一般的WAL预写日志是先写入日志再写入内存,HBase正好相反,先写入内存在写入日志,依托mvcc模式确保一致性(mvcc是什么模式)
大致过程:
1.Client会先访问ZK,得到对应的RegionSever地址
2.Client对RegionServer发起写请求,RegionServer接受请求并写入到内存中
3.当MemStore大小达到一定的阈值的时候Flush到StoreFile并存储在hdfs上
读取数据
1.Client访问ZK获取RegionServer的相关信息。
2.Client发起读取数据的请求,RegionServer接受请求
3.RegionServer接受到请求先扫描自己的MenStore,再扫描BlockCache(加速读内容缓存区),如果还是没能找到,就回去StoreFile上获取数据并返回。
注意:HMaster在启动的时候就会把HBase的系统表加载到zookeeper,通过访问ZK就可以获取当前HBase的集群的相关节点的元数据的信息,表信息和region的信息,故读写过程只需访问ZK和对应的RegionServer的信息就可以了,如此依赖HMaster的负载就减少了。
本文档的内容是自己在接触到HBase的学习过程中了解到的,用于记录自己的学习过程,如有不对欢迎指正