第四章-分布式数据库HBase

第四章-分布式数据库HBase

HBase简介

BigTable是一个分布式存储系统,利用 MapReduce分布式并行计算模型来处理海量数据,使用谷歌分布式文件系统 GFS作为底层数据存储,可以扩展到PB级别的数据和上千台机器,具备广泛应用性、可扩展性、高性能和高可用性等特点。

HBase是一个高可靠、高性能、面向列、可伸缩的分布式数据库,是谷歌 BigTable的开源实现,主要用来存储非结构化和半结构化的松散数据。HBase的目标是处理非常庞大的表,可以通过水平扩展的方式,利用廉价计算机集群处理由超过10亿行数据和数百万列元素组成的数据表。

d41

  • 利用 MapReduce来处理 HBase中的海量数据,实现高性能运算
  • 利用 HDFS作为高可靠的底层存储,利用廉价集群提供海量数据存储能力
  • 利用 Zookeeper提供协同服务,实现稳定服务和错误恢复
  • Sqoop为 Hbase提供高效便捷的 RDBMS数据导入功能
  • Pip和 Hive提供了高层语言支持

HBase与传统关系数据库的区别

传统关系数据库 HBase
数据类型 采用关系模型,具有丰富的数据类型和存储方式 采用了更加简单的数据模型,把数据存储为未经解释的字符串,用户需要自己编写程序解析字符串
数据操作 包含了丰富的操作,其中会涉及复杂的多表连接 不存在复杂的表与表之间的关系,只有简单的插入、查询、删除、清空等,不能实现表与表的连接查询
存储模式 基于行模式存储 基于列存储,不同列族的文件是分离的。可以降低 I/O开销,支持大量并发用户查询
数据索引 通常可以针对不同列构建复杂的多个索引,以提高数据访问性能 只有一个索引——行键,HBase中的所有访问方法,或通过行键访问,或通过行键扫描
数据维护 更新操作会用最新的当前值去替换记录中原来的旧值,旧值被覆盖后就不会存在 执行更新操作时,并不会删除数据旧的版本,而是生成一个新的版本,旧有的版本仍然保留
可伸缩性 很难实现横向扩展,纵向扩展的空间也比较有限 能够通过在集群中增加或者减少硬件数量来实现性能的伸缩

HBase也有自身的局限性,比如不支持事务,因此无法实现跨行的原子性。

HBase数据模型

数据模型概念

HBase是一个稀疏、多维度、排序的映射表,这张表的索引是行键、列族、列限定符和时间戳。每个值是一个未经解释的字符串,没有数据类型。用户在表中存储数据,每一行都有一个可排序的行键和任意多的列。

表在水平方向由一个或者多个列族组成,一个列族中可以包含任意多个列,同一个列族里面的数据存储在一起。列族支持动态扩展,可以很轻松地添加一个列族或列,无需预先定义列的数量以及类型,所有列均以字符串形式存储,用户需要自行进行数据类型转换。HBase中执行更新操作时,并不会删除数据旧的版本, 而是生成一个新的版本,旧有的版本仍然保留。

HBase数据模型的相关概念

概念 描述
HBase采用表来组织数据,表由行和列组成,列划分为若干个列族
每个 HBase表都由若干行组成,每个行由行键(row key)来标识
列族 一个 HBase表被分组成许多“列族”(Column Family)的集合,它是基本的访问控制单元
列限定符 列族里的数据通过列限定符(或列)来定位
单元格 在 HBase表中,通过行、列族和列限定符确定一个“单元格”(cell),单元格中存储的数据没有数据类型,总被视为字节数组 byte[ ]。每个单元格可以保存一个数据的多个版本,对应不同的时间戳。
时间戳 每个单元格都保存着同一份数据的多个版本,这些版本采用时间戳进行索引。一个单元格的不同版本是根据时间戳降序的顺序进行存储的,最新的版本可以最先被读取

d42

HBase中使用坐标来定位表中的数据,需要根据行键、列族、列限定符和时间戳来确定一个单元格,因此,可以视为一个“四维坐标”,即 [行键, 列族, 列限定符, 时间戳]。

[“201505003”, “Info”, “email”, 1174184619081] [email protected]
[“201505003”, “Info”, “email”, 1174184620720] [email protected]

概念视图

在 HBase的概念视图中,一个表可以视为一个稀疏,多维的映射关系。每个行都包含相同的列族,尽管行不需要在每个列族中存储数据。
d43

这是一个存储网页的 HBase表的片段。

  • 行键是一个反向 URL(即 com.cnn.www),之所以这么存放,是因为 HBase是按照行键的字典序来排序存储数据的,采用反向 URL的方式,可以让来自同一个网站的数据内容都保存在一个相邻的位置,在按照行键的值进行水平分区时,就可以尽量把来自同一个网站的数据划分到同一个分区(Region)中。
  • contents列族用来存储网页内容。
  • anchor列族包含了任何引用这个页面的锚链接文本。

物理视图

在概念视图层面,HBase每个表是由许多行组成的;但是在物理存储层面,它是采用了基于列的存储方式,这也是 HBase和传统关系数据库的重要区别。

上面的概念视图在物理存储的时候,HBase表会按照 contents、anchor这两个列族分别存放,属于同一个列族的数据保存在一起。同时,和每个列族一起存放的还包括行键和时间戳。
d44

在概念视图中,有些列是空的,即这些列上面不存在值。在物理视图中,这些空的列不会被存储成 null,而是根本就不会被存储,当请求这些空白的单元格时,会返回 null值。

面向列的存储

行式数据库使用 NSM(N-ary Storage Model)存储模型,一个元组(或行)会被连续地存储在磁盘页中。在从磁盘中读取数据时,需要从磁盘中顺序扫描每个元组的完整内容,然后从每个元组中筛选出查询所需要的属性。如果每个元组只有少量属性的值对于查询是有用的,那么 NSM就会浪费很多磁盘空间和内存带宽。

列式数据库采用 DSM(Decomposition Storage Model)存储模型,目的是最小化无用的 I/O。DSM会对关系进行垂直分解,并为每个属性分配一个子关系,每个子关系单独存储,每个子关系只有当其相应的属性被请求时才会被访问。DSM的缺陷是:执行连接操作时需要昂贵的元组重构代价。
d45

行式数据库主要适合于小批量的数据处理,如联机事务型数据处理,我们平时熟悉的 Oracle、MySQL等关系数据库都属于行式数据库。

列式数据库主要适合于批量数据处理和即席查询(Ad-Hoc Query),它可以降低 I/O开销,支持大量用户并发查询,其数据处理速度比传统方法快100倍。列式数据库主要用于数据挖掘、决策支持和地理信息系统等查询密集型系统中。

HBase实现原理

HBase功能组件

HBase的实现包括三个主要的功能组件:

  • 库函数:链接到每个客户端
  • 一个 Master主服务器
  • 许多个 Region服务器

Region服务器负责存储和维护分配给自己的 Region,处理来自客户端的读写请求。

主服务器 Master负责管理和维护 HBase表的分区信息,维护 Region服务器列表,检测集群中的 REgion服务器,合理分配 Region实现负载均衡,以及处理模式的变化,如表和列族的创建 。

客户端并不是直接从 Master主服务器上读取数据,而是在获得 Region的存储位置信息后,直接从 Region 服务器上读取数据。

表和Region

对于每个 HBase表,表中的行是根据行键的值的字典序进行维护的。因此分布式存储时需要根据行键的值对表中的行进行分区,每个行区间构成一个分区,被称为“Region”。它包含了位于某个值域区间内的所有数据,是负载均衡和数据分发的基本单位,这些 Region会被分发到不同的服务器上。

每一个表格最初都只包含一个 Region,随着数据的不断插入,Region会持续增大,当一个 Region中包含的行数量达到一个阈值时,就会被自动等分成两个新的 Region。随着表中行的数量持续增加,就会分裂出越来越多的 Region。
d46

Master主服务器会把不同的 Region分配到不同的 Region服务器上,但是同一个 Region是不会被拆分到多个服务器上的。每个 Region的最佳大小取决于单台服务器的有效处理能力,通常建议是1GB~2GB。每个 Region服务器负责管理一个 Region集合,通常一个集合是10~1000个 Region。

Region的定位

每一个 Region都有一个 RegionID来标识它的唯一性,为了定位每个 Region所在的位置,就可以构建一张映射表。映射表的每行包含两项内容,一个是 Region标识符,另一个是 Region服务器标识符,这一行就表示 Region和 Region服务器之间的对应关系。这个映射表也被称为“元数据表”,又名“.META.表”。为了加快访问速度,.META.表的全部 Region都会被保存在内存中。

当 HBase表中的 Region数据非常庞大时, .META.表也会被分裂 成多个 Region。为了定位这些 Region,再构建一个新的映射表,记录所有元数据的具体位置,就是“根数据表”,又名“-ROOT-表”。-ROOT-表是不能被分割的,永远只存在一个 Region用于存放-ROOT-表 ,这个 Region的名字是写死的,Master服务器永远知道它的位置。

客户端访问用户数据之前,需要首先访问 Zookeeper,获取-ROOT-表的位置信息,然后访问-ROOT-表,获取.META.表的信息,接着访问.META.表,找到所需的 Region具体位于哪个 Region服务器,最后才会到该 Region服务器读取数据。
d47

为了加快寻址过程,一般会在客户端做缓存,把查询过的位置信息缓存起来。这样以后访问相同数据时,就可以直接从客户端缓存中获取 Region的位置信息,而不需要每次都经历一个“三级寻址”过程。

综上所述,HBase使用类似 B+树的三层结构来保存 Region位置信息。

层次 名称 作用
第一层 Zookeeper文件 记录了-ROOT-表的位置信息
第二层 -ROOT-表 记录了.META.表的 Region位置信息,-ROOT-表只有一个 Region。通过-ROOT-表就可以访问.META.表中的数据
第三层 .META.表 记录了用户数据表的 Region位置信息,.META.表可以有多个 Region,保存了 HBase中所有用户数据表的 Region位置信息

HBase运行机制

HBase系统架构

HBase的系统架构包括客户端、Zookeeper服务器、Master服务器、Region服务器。HBase一般采用 HDFS作为底层数据存储。
d48

客户端:包含访问 HBase的接口,同时在缓存中维护着已经访问过的 Region位置信息,用来加快后续数据访问过程。HBase客户端使用 HBase的 RPC机制与 Master服务器和 Region服务器进行通信。

Zookeeper:Zookeeper存储-ROOT-表的地址和 Master地址, Region Server主动向 Zookeeper注册,使得 Master可随时感知 各 Region Server的健康状态。Zookeeper可以帮助选举出一个 Master作为集群的总管,并保证在任何时刻总有唯一一个 Master在运行,这就避免了Master的“单点失效”问题。

Master主服务器:Master主要负责表和Region的 管理工作

  • 管理用户对表的增加、删除、修改等操作
  • 实现不同Region服务器之间的负载均衡
  • 在Region分裂或合并后,负责重新调整Region的分布
  • 对发生故障失效的Region服务器上的Region进行迁移

Region服务器:HBase中最核心的模块,负责维 护分配给自己的Region,并响应用户的读写请求。

Region工作原理

Region服务器内部管理了一系列 Region对象和一个共用的 HLog文件。HLog文件是磁盘上面的记录文件,记录了所有的更新操作。每个 Region对象又是由多个 Store组成的,,每个 Store又包含了一个 MemStore和若干个 StoreFile。其中,MemStore是在内存中的缓存,保存最近更新的数据,StoreFile是磁盘中的文件。

这些文件都是 B树结构,方便快速读取。StoreFile在底层的实现方式是 HDFS文件系统的 HFile,HFile的数据块通常采用压缩方式存储,压缩之后可以大大减少网络 I/O和磁盘 I/O。
d49

Store是 Region服务器的核心,每个 Store对应了表中的一个列族的存储。当用户写入数据时,系统首先把数据放入 MemStore缓存,当缓存满时,就会刷新到磁盘中的一个 StoreFile文件中。StoreFile达到一定的数量之后就会触发文件合并操作,多个 StoreFile合并成一个大的 StoreFile文件,这个StoreFile会越来越大。当StoreFile文件的大小超过一定的阈值时,就会触发文件分裂操作。同时,当前的父 Region会被分裂成2个子 Region,父 Region会下线,新分裂出的2个子 Region会被 Master分配到相应的 Region服务器上。
d491

HBase采用 HLog来保证系统发生故障时可以恢复到正常状态。HBase系统为每个Region服务器配置了一个HLog 文件,它是一种预写式日志(Write Ahead Log)。用户更新数据必须首先写入日志后,才能写入 MemStore缓存,并且,直到 MemStore缓存内容 对应的日志已经写入磁盘,该缓存内容才能被刷新写入磁盘。

Zookeeper会实时监测每个 Region服务器的状态,当某个 Region服务器发生故障时,Zookeeper会通知 Master。Master首先会处理该故障 Region服务器上面遗留的 HLog文件,这个遗留的HLog文件中包含了来自多个 Region对象的日志记录。系统会根据每条日志记录所属的 Region对象对 HLog数据进行拆分,分别放到相应 Region对象的目录下,然后,再将失效的 Region重新分配到可用的 Region服务器中,并把与该 Region对象相关的 HLog日志记录也发送给相应的 Region服务器。

Region服务器领取到分配给自己的 Region对象以及与之相关的 HLog日志记录以后,会重新做一遍日志记录中的各种操作,把日志记录中的数据写入到 MemStore缓存中,然后,刷新到磁盘的 StoreFile文件中,完成数据恢复。

HBase系统中,每个 Region服务器只需要维护一个 HLog文件,所有的 Region对象共用一个 HLog。这样可以减少磁盘寻址次数,提高对表的写操作性能。

发布了61 篇原创文章 · 获赞 25 · 访问量 7178

猜你喜欢

转载自blog.csdn.net/qq_42582489/article/details/105177479