Hbase是BigTable的开源实现
分布式存储系统,最初是为了解决在大量数据下互联网的搜索问题
特点:
(1)架构在GFS上,使用GFS作为底层数据存储;
(2)利用谷歌的MapReduce来处理海量数据;
(3)利用Chubby提供协同服务管理;
(4)可以扩展为PB级别的数据和上千台机器;
项目 | Bigtable | HBase |
---|---|---|
文件存储系统 | GFS | HDFS |
海量数据存储 | MapReduce | Hadoop MapReduce |
协同服务管理 | Chubby | Zookeeper |
在已有HDFS和关系型数据库的条件下,为什么产生了HDFS:
(1) Hadoop主要解决大规模数据的离线批量处理问题,但是受限于Hadoop MapReduce框架的延迟数据处理机制,使得其无法实施处理大规模的数据
(2)HDFS面向批量访问,而非随机访问
(3)传统的关系型数据库无法应对数据规模剧增是产生的问题
(4)传统关系数据库在结构数据变化时一般要停机维护,且空列浪费存储空间
和传统关系数据库区别:
传统数据库 | HBase | |
---|---|---|
数据类型 | 关系模型,具有丰富的数据类型和存储方式 | 数据模型,将数据存储为未经解释的字符串 |
数据操作 | 操作丰富,涉及多表连接 | 只有简单的增删改查 |
存储模式 | 基于行存储 | 基于列存储 |
数据索引 | 可以对不同列构建多个复杂的索引 | 只有一个索引-行键 |
数据维护 | 新值替换旧值 | 更新时,旧版本仍会保留 |
可伸缩性 | 很难实行横向扩展,纵向扩展也有限 | 水平扩展性很好 |
(1) HBase是一个稀疏,多维,排序的映射表,索引是:行键、列族、列限定符和时间戳
(2)每个值是未经解释的字符串,没有数据类型
(3)表中每一行有一个排序的行键和任意多的列
(4)表在水平方向由一个或多个列族组成。一个列族里包含任意多的列,同一个列族的数据存储在一起
(5)列族支持动态扩展,可以随意添加列族和列
(6)HBase执行更新操作时,不会删除旧数据,是生成一个新的版本(是基于HDFS只允许追加不允许修改的特性)
表:由行和列构成
行:由行键标识
列族:一个表被分为多个列族,HBase基本的存储单元
列限定符:列名,列族里的数据听过列限定符来定位
单元格:存储数据的单元,通过行、列族和列限定符来确定一个单元
时间戳:每个单元格保存着一份数据的多个版本,通过时间戳来索引
传统数据库采用二维坐标定位,即行和列。HBase采用四维坐标来定位:[行键,列族,列限定符,时间戳]
行式存储适用于事务性操作,比如查询某个人的名字,年龄,性别等
列式存储适用于分析数据,比如要分析年龄这个字段。列式存储具有较高的压缩比,因为在列中数据类型基本相同,且数据处理速度也较快
组件 | 功能 |
---|---|
库函数 | 链接客户端,让其可以访问HBase数据库 |
Master主服务器 | (1)管理和维护 HBase的分区信息 (2)维护Region服务器列表 (3)分配Region,实现负载均衡 |
Region服务器 | 存储和维护分配给自己的Region,处理来自客户端的读写请求 |
注:
(1)客户端不在Master主服务器上读取数据,而是在获得Region的存储位置信息后,直接从Region服务器上读取数据
(2)客户端不依赖于Master,而是借助于Zookeeper通过三级寻址的方式来获得Region位置信息,大多数客户端从来不和Master通信
(1)一个HBase中有多个表。一个表中存储的行的数量可能非常庞大,无法存储在一台机器上,需要进行分区。根据行键的值对表中的行进行分区,每个行区间构成一个分区,成为“Region”
(2)初始,每个表只有一个Region,随着数据的增多,Region逐渐增大,当一个Region中包含的行数量达到一个阈值会自动分为两个Region,然后分裂出越来越多的Region
(3)Master主服务器将不同的Region分发到不同的Region服务器上。同一个Region只能在一个服务器上,每个Region服务器负责管理一个Region集合
一个HBase的表可能非常庞大,会被分裂为多个Region,如何判断Region分到了哪个Region服务器上?
HBase三层结构:
层次 | 名称 | 作用 |
---|---|---|
第一层 | Zookeeper文件 | 记录了-ROOT-表的位置信息 |
第二层 | -ROOT-表 | 记录了.META.表的Region位置信息-ROOT-表只能有一个Region。通过-ROOT-表,就可以访问.META.表中的数据 |
第三层 | .META.表 | 记录了用户数据表的Region位置信息,.META.表可以有多个Region,保存了HBase中所有用户数据表的Region位置信息 |
(1) 每个Region有一个唯一的RegionID。".META表"(元数据表)中包含Region和Region服务器的对应关系
(2)Region数量增加时,".META表"中条目会非常多,会分裂为多个Region,又回产生一个新的映射表“-ROOT-表”(根数据表),记录元数据的位置。“-ROOT-表”不能分割,永远只有一个Region存放-ROOT-表,Master知道这个Region的位置
客户端首先访问Zookeeper,获取-ROOT-表的位置信息------->访问-ROOT-表,获取.META.表的文位置信息---------->访问.META.表,找到所需的Region位于哪个服务器,然后到该服务器读取数据
(1)用户读写数据的过程:
写:分配搭配相应的Region服务器去执行,数据首先写入MemStore和HLog中,当写入HLog中,才会返回客户端
读:Region服务器首先访问MemStore缓存,如果不存在,访问StoreFile
(2)缓存的刷新:
MemStore缓存容量有限,系统周期性的将其写入到StoreFile中,清空缓存,并在HLog中写入一个标记,表示缓存内容已经写入到StoreFile中。每次刷新产生一个新的StoreFile文件。
在Region服务器启动时,会检查HLog文件,确认最后一次执行缓存刷新后是否产生新的写入操作,如果存在,要将更新操作写入MemStore中,然后执行缓存刷新,写入StoreFile中。最后,删除旧的HLog文件,为用户提供访问服务
(3)StoreFile的合并:
每次执行缓存刷新都会产生一个新的StoreFile文件,当数量非常多时,要访问某个Store中的值时,必须查找所有的StoreFile文件,耗费时间。当达到一个阈值时,会触发合并操作,将多个StoreFile文件合并成一个大文件
因为Region服务器可能搭建中廉价机的集群上,当发生故障时,MemStore中的数据会丢失,因此,HBase采用HLog来保证系统发生故障时能够恢复到正确的状态。
用户更新数据时,必须要先记入HLog日志中才能写入MemStore缓存,且直到其对应的日志写到磁盘之后,缓存内容才会被刷新写入磁盘。
当发生故障时,Zookeeper检测到会通知Master,Master处理故障服务器上的HLog文件(包含多个Region对象的日志记录),对HLog数据进行拆分,分别放到相应Region对象的目录下,然后将失效的Region及其日志文件分配到另一个服务器中,重复日志记录中的操作,将数据写入到缓存中,然后刷新到StoreFile文件中,完成恢复
一个Region服务器中所有的Region对象使用一个HLog文件
优点:在多个Region对象进行更新操作时,只需要将日志记录追加到单个日志文件中,减少磁盘寻址次数,提高写操作的性能
缺点:若发生故障,要对HLog按照其所属的Region对象进行拆分