简介
是一个高可靠性、高性能、面向列、可伸缩的分布式数据库。目标是储存并处理大型的数据。有一下特点
- 容量大:可以存储成千上万的行和列组成的数据
- 面向列:HBase是面向列的存储和权限控制。列存储,其数据在表中是按照每列存储的,根据数据动态怎能更加列,并且可以单独对列进行各种操作。
- 多版本:HBase中表的每一个列的数据存储都有多个版本Version。一般的每一列队形一条数据,但是有的数据会对应多个版本。
- 稀疏性:由于HBase中表的列允许为空,并且不会占用存储空间,因此表的设计可以非常稀疏
- 扩展性:HBase的底层是依赖于HDFS。当磁盘空间不足时,我们可以动态增加机器(DataNode节点)来解决。从而避免像关系型数据库那样,进行数据的迁移。
- 高可靠性:由于底层使用的是HDFS二HDFSyou备份机制,所以Spark集群出现严重问题是,Replication(副本)机制能够保证数据不会发生丢失或者损坏。
- HBase利用HDFS作为文件存储系统,利用MapReduce来处理HBase中海量数据,利用Zookeeper作为协调服务
- 存储模式:传统数据库是根据行存储,而HBase是根据列进行存储
- 表字段:传统数据库的表字段不能超过30个,而HBase中表字段不不作限制
- 可延展性:HBase是根据数据存储的大小去动态增加列,列是不固定的
HBase的数据模型
Row Key行键
表示行键,每个HBase表中只能有一个行键,它在HBase中以字典的方式存储。在HBase中唯一表示。可以对网站名称进行
Timestamp时间戳
表示时间戳,记录每次操作的时间,通常基座数据的版本号,会自己生产
Column列
HBase的列是由列族名、限定符及列名组成,其中:记为限定符。创建HBase表不需要指定列,因为列是可变的。
Column Family列族
在HBase中列族由很多列组成。在同一表中,不同列族由完全不同的属性,但在统一列都会有相同的属性,而属性都是定义在列族上。c1,c2,c3都是列族名。
HBase的架构
- Client。客户端,他通过RPC协议与HBase进行通信
- Zookeeper。分布式协调服务,主要用于监控HRegionServer的状态,将HRegionServer的上下线信息实时通知给HMaster,确保急群众只有一个HMaster在工作
- HMaster。HBase的主节点,协调多个HRegionServer,用于监控HRegionServer的状态以及平衡HRegionServer之间的负载。还负责为HRegionServer分配HRegion。
- 在HBase中如果有多个HMaster节点共存,提供服务的只有一个Master。其他Master处于待命状态。如果当前服务的Master宕机,其他的Master节点会接管HBase集群
- HRegionServer。HBase的从节点,他还包含了多个HRegion,主要用于响应用户的I/O请求,向HDFS读写数据
- HRegion。HBase表的分片,每个region中保存的是HBase表中的某段连续的数据
- Store。每一个HRegion包含一个或者多个Store。每个Store用于管理一个Region上的一个列族
- MemStore。内存级缓存,MemStore存放在Store中,用于保存修改的数据。当MemStore存储的数据达到默认128M时数据就会进行flush操作,将数据写入到StoreFile文件。MemStore的flush的操作是由专门的线程负责的
- StoreFile。MemStore中数据写到文件后就是StoreFile,StoreFile底层是以HFile的格式保存在HDFS上
- HFile。HBase中键值对类型的数据都是以HFile文件格式进行存储
- HLog。预写日志文件, 负责记录HBase的修改。
物理存储
- HBase表的数据按照行键Row Key 的字典进行排序,并且切分多个HRegion存储,如5-11
- 每个Region存储的数据是有限的,如果当Region增大到默认128M,会被切分成两个新的Region。如5-12
- 一个HRegionServer上可以存储多个Region,但是每个Region只能被分布到一个HRegionServer上,如5-13
- MemStore中存储的是用户写入的数据,一但MemStore存储达到阈值,里面的数据就会别刷新到新生成的StoreFile中(底层是HFIle)。如5-14
寻址机制
HBase查询数据的寻址过程
如查询行键:rk001数据
- Client客户端通过访问ZooKeeper来请求行键rk001数据所在的RegionServer地址
- Zookeeper从–ROOT表中查询所有.META信息
- META表将具体存储行键rk001数据的RegionServer的地址返回给Client,相当于Client是从Zookeeper中MATA表中查询到RegionServer的地址
- Client获取到RegionServer地址后直接向该RegionServer发送查询行键为rk001这条数据的请求,RegionServer收到请求,就会查询行键rk001的Region;
- RegionServer将行键为rk001的数据的所有信息返回给Client
- HBase中,又来那个歌特殊的表,分别是ROOT和META表。ROOT只有一个Region,且不会切分而META表中存储着RegionServer,且RegionServer还可以被切分成多个Region。
HBase读写数据流程
读数据流程
- Client通过Zookeeper、ROOT表以及META表来找到目标数据所在的RegionServer地址
- Client通过请求RegionServer地址来查询目标数据
- RegionServer定位到目标数据所在的Region然后发出查询目标数据的请求
- Region现在MemStore中查找目标数据,若没有找到则继续在StoreFile中查找
写数据流程
- Client根据行键RowKey找到丢应的Region所在的RegionServer
- Client向RegionServer发送写入数据的请求
- RegionServer找到目标Region
- Region检查数据是否与Schema一致
- 若Client没有指定版本,则获取当前系统的时间作为数据的版本
- 将更新的记录写入预写日志HLog和MemStore中
- 半段MemStore是否已满,若满了则进行flush操作,将数据写入StoreFile文件,反之存入MemStore、