设为首页 加入收藏

TOP

HBase的基本结构
2019-05-02 01:46:32 】 浏览:42
Tags:HBase 基本 结构
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013595419/article/details/79393959

HBase 的表、列和单元格

基本单位是列(column),一列或多个列成行(row),一个行有唯一行健(rowkey)确定存储,每个列可能有多个版本,多个版本存储在单元格(cell)中,行序是按照字典顺序进行排序的,意思是从左到右一次对比每一个键。

排列顺序可能跟预期的不一样,可以添加补键来获取正确的顺序,比如 row-1 永远小于 row-2,无论后面是什么,将始终按照这个顺序排列。

按照行健排序可以获得像RDBMS的主键索引一样的特性,也就是说,行健总是唯一,并且只出现一次,否则你就是在更新同一行。一行由若干列组成,若干列又构成一个列族(column family),这不仅有助于构建数据的语义边界或者局部边界,还有助于我们给它们设置某些特性(如压缩),或者指示它们存储在内存中。一个列族的所有列存储在同一个底层的存储文件李,这个存储文件叫做HFile

HBase的设计中,行和列并不像经典的电子表格模型那样排列,而是采用了标签描述(tag metaphor),也就是说,信息保存在一个特定标签下面。如图所示:

hbase-column-and-row

每一个列的值或单元格的值都具有时间戳,默认由系统指定,也可以由用户显式设置。(时间戳可以用来区分不同版本的值),一个单元格的不同版本的值按照降序排列在一起,访问的时候优先读取最新的值。这种优化的目的在与让新值比老值更容易被读取。

HBase是按照BigTable模型实现的,是一个稀疏的、分布式的、持久化的、多维的映射,由行健,列建和时间戳索引。将上述特点联系在一起,我们就有了如下的数据存取格式。

(Table, RowKey, Family, Column, Timestamp) -> Value

为了方便表示,这里使用两种视图进行展示。

基于时间的行的组成部分

基于时间的行的组成部分

用电子表格展示行中相同的部分

用电子表格展示行中相同的部分

自动分区

Hbase中扩展和负载均衡的基本单元称为region,region本质上是以行健排序的连续存储的区间。如果region太大,系统就会把它们动态拆分,相反,就把多个region合并,以减少存储文件数量。

一张表初始的时候只有一个region,用户开始向表种插入数据,系统会检测这个region的大小,确保其不超过这个配置最大值。如果超过了限制就会从中间键(middle key, region中间的那个行键)处将这个region拆分为大致相等的两个子region。

每一个region只能由一台region服务器(region server)加载,每一台region服务器可以同时加载多个region。

region拆分和服务相当于其他系统提供的自动分区(autosharding),当一个服务器出现故障后,该服务器上面的region可以快速恢复,并获得细粒度的负载均衡,因为当服务于某个region的服务器当前负载过大、发生错误或者被停止使用导致不可用时,系统会将该region移到其他服务器上面。

region拆分的操作也非常快——接近瞬间,因为拆分后的region读取的仍然是原存储文件,直到合并把存储文件异步地写成独立的文件。

HBase的实现

数据存储在存储文件(store file)中,成为HFile,HFile存储的是经过排序的键值映射结构。文件内部由连续的块组成,块的索引信息存储在文件的尾部。当把HFile文件打开并加载到内存时,索引信息会优先加载到内存中,每个块的默认大小是64KB,可以根据需要配置不同的块大小。存储文件提供了一个设定起始和终止行健范围的API用于扫描特定的值。

每一个HFile都有一个块索引,通过一个磁盘查找就可以实现查询。首先,在内存的块索引中进行二分查找,确定可能包含地给定键的块,然后读取磁盘块找到实际要找的键。

存储文件通常保存在HDFS中,HDFS提供了一个可扩展的、持久的、冗余的HBase存储层。存储文件通过将更改写入到可配置数目的物理服务器中,以保证数据不会丢失数据。

更新数据

每次更新数据时,都会先将数据记录在提交日志(commit log)中,在HBase中这叫做预写日志(write-ahead log, WAL),然后才会将这些数据写入内存中的memstore中。一旦内存保存的写入数据的累计大小超过了一个给定的最大值,系统就会将这些数据移出内存作为HFile文件写入到磁盘中。数据移出内存后,系统会丢弃对应的提交日志,只保留未持久化到磁盘中的提交日志。在系统将数据移出memstore写入磁盘的过程中,可以不必阻塞系统的读写,通过滚动内存中的memstore就能达到这个目的,即用空的新的memstore获取更新数据,将满的旧的memstore转换成一个文件。请注意,memstore中的数据已经按照行健排序,持久化到磁盘中的HFile也是按照这个顺序的,所以不必执行排序或者其他的特殊处理。

Hbase-implemetion

因为存储文件是不可被改变的,所以无法通过移除某个键值对来简单的删除值,可行的解决办法是做删除标记(delete marker),或称为墓碑标记,表明给定行已经被删除的事实。在检索过程中,这些删除标记覆盖了实际值,客户端读不到实际值。

读回数据

读回数据是两部分数据合并的结果,一部分是memstore中还没有写入磁盘的数据,另一部分是磁盘上的存储文件。值的注意的是,检索文件时用不到WAL,只有服务器内存中的数据在服务器崩溃前没有写入到磁盘,而后进行恢复时才会用到WAL。

管家机制

随着memstore中的数据不断写入到磁盘中,会产生越来越多的HFile文件,HBase内部有一个解决这个问题的管家机制,即用合并将多个文件合并到一个较大的文件。合并有两种类型:minor compactionmajor compaction

minor合并

minor合并是将多个小文件重写为数量较小的大文件,减少存储文件的数量,这个过程实际上是多路归并的过程。因为HFile的每个文件都是经过归并的,所以合并速度非常块,只受到磁盘I/O性能的影响。

major合并

major合并是将一个region中一个列族的若干个HFile重写为一个新的HFile,与minor合并相比,还有更独特的功能:major合并能扫描所有的键值对,顺序重写全部数据,重写数据的过程中会略过做了删除标记的数据。断言删除此时生效。例如,对于那些超过版本号限制的数据以及生存时间到期的数据,在重写数据时就不再写入磁盘了。

Hbase的基本组件

HBase中有3个主要组件,客户端库一台maser主服务器多台region服务器。可以动态地增加和移除region服务器以适应不断变化的负载。master服务器主要负责利用Apache Zookeeper为region服务器分配region,Apache Zookeeper是一个可靠的、高可用的、持久化的分配协调系统。

系统组件之间的结构如下图所示:

Hbase-system

master服务器负责跨region服务器的全局region的负载均衡,将繁忙的服务其中的region移到负载较轻的服务器中。master服务器不是实际的数据存储或者检索路经的组成部分,它仅仅提供了负载均衡和集群管理,不为region服务器或者客户端提供任何数据服务,因此是轻量级服务器。此外,master服务器还提供了元数据的管理操作,例如建表和创建列族。

region服务器负责为它们服务的region提供读写请求,也提供了拆分超过配置大小的region的接口。客户端则直接与region服务器通信,处理所有数据相关的操作。

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Hbase编程封装实例 下一篇hdfs读取文件插入到hbase简单实例

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目