Hbase

HBase概述

HBase是一款基于HDFS做存储的,Zookeeper做调度的能够存储半结构化与非结构化数据的数据库。它不同于Hive它是一个真正的数据库产品,它的内部基于顺序IO与内存读写,能够非常高效的实现数据的增删改查。

HBase的总体架构

HBase有如下几个部件协调服务:

HMaster:主要负责,给HRegionServer分配Region,HRegionServer的负载均衡。负责HDFS上的垃圾回收。(待讨论)HMaster一般都会配置成双机热备。一个HMaster与一个BackUpHMaster。

Zookeeper:负责协调HBase集群,保证集群中只有一个HMaster、将HRegionServer的在线情况告诉HMaster、存储meta表的的Region的地址信息、存储HBase的元数据信息。

HRegionServer:维护HMaster分配给自己的Region。处理这些Region的IO信息,包括Region的拆分。

Client:访问HBase保存一些消息以提高效率。

HBase表逻辑结构

HBase表的逻辑结构如下图所示:

在这里插入图片描述
总共由以下几个元素构成:

行键:每一行数据由一个行键来标识,我们在查询HBase中的数据时就是通过行键来定位的。一般的查询有三种方式,①根据行键查询,②根据行键范围查询,③全表扫描

列族:列族是一Hbase表从纵向来切分的逻辑结构,一个列族包含若干列。它是Hbase元数据的一部分。

:一个列族中包含多个列,在创建HBase表的时候不需要创建列因为它可以在表创建之后动态的添加。它不是元数据的一部分。

单元格:由一个行键所标识的行和某一个列族中的某一列相交形成,这是Hbase中存储数据的最小单位。它里面可以存放若干值,他们分别代表这个单元格中的数据的不同版本。其中不同版本的单元格会被时间戳锁标识。需要注意的是Hbase中没有数据类型所有的类型都是二进制。

数据存储核心组件HRegion

HBase将一个表从逻辑上横向切分成若干个HRegion,这些HRegion会分布在不同的机器上我们把这些·机器称之为HRegionServer。我们也可以看到HRegion是实现HBase分布式与负载均衡的基础。
在这里插入图片描述
起初,一个表中只包含一个HRegion,所有的数据都放在一个HRegion中。但是随着数据量的积累,HRegion中的数据会越来越多,这时HRegion就会产生分裂。以此类推数据不断增大就会不断的分裂产生更多的HRegion。如下图所示:
在这里插入图片描述
而HRegion的内部结构如下图所示:
在这里插入图片描述
一个HBase表包含着多个HRegion;

一个HRegion中包含着多个Store(Store的数量与表中列族的数量是一致的);

一个Store中又包含了两种组件:

memStore,这是一块基于内存的区域,一般情况下用户对数据的操作直接与memStore打交道(这也是为什么HBase效率高的原因);
storeFile,这时一块基于硬盘的区域,当memStore写数据溢出时就会开启一个新的memStore而旧的memStore会讲之前的数据写到一个storeFile中。而这只是逻辑上的结构,实务上所有的storeFile都会存到HDFS中,在HDFS中storeFile的名字会改名为HFile。

HBase写数据流程

当我们要写入一条数据时

①首先通过表名与行键找到我们需要操作的HRegion(由于是横向切割所以使用的是行键来确定HRegion)。

②然后根据列族找到对应的Store。对该Store中的memStore中写数据。当memStore写数据溢出时就会开启一个新的memStore而旧的memStore会将之前的数据写到一个storeFile中。最后持久化到HDFS中存储为HFile文件。

③HFile会越存越大然后产生分裂。成不同的小文件。又,memStore的会不断的更新数据,这就使得HFile中的数据过期或者是同一条数据在多个HFile中不一致。这样HFile就会定时触发合并再分裂的机制。具体来说就是将几个HFile合并起来,然后将最新版本的数据覆盖旧版本的数据。最后再将这个文件分裂开来。
写入文件的流程如下图所示:
在这里插入图片描述
HBase的写可以认为是基于内存来实现的,速度非常的块,最终通过溢写到HFile中数据持久化高可靠的保存在HDFS中,保证了数据可靠。

HBase读数据流程

当客户端联系HBase标识要读取某一张表时,根据表和行键确定出HRegion,找到存有该HRegion的HRegionServer,找到HRegion,根据要 查找的列族,确定出要查询的Store,首先在memStore中寻找要查询的数据,如果能查到,直接返回查询到的数据,查询结束。如果在memStore中找不到要查询的数据,要查询该store对应的所有的storeFile,在这个过程中,解析storeFile,先读取storeFile中的Trailer块,找到DataBlockIndex,根据判断要找到数据在当前storeFile中是否存在,如果不存在直接返回空 ,如果存在则找到对应的DataBlocks中的DataBlock返回。这样多个storeFile可能返回了多个DataBlock,其中包含着多个版本的查询的数据结果,之后在内存中将这些DataBlock信息合并,得到最新的数据返回,完成查询。
在理想的情况下 ,HBase的查询可以基于内存完成,效率很高,在最不理想的情况下,需要大量的查询底层的HDFS文件,性能会有所下降,但是,由于这些storeFile都增加了索引,所以查询的速度仍然是由保证的,但是仍然会比最理想的情况慢大概一个数量级。
在这里插入图片描述
问题1:内存满了怎么办
当不停的写入数据,将store中的memStore填满时,重新生成一个新的memStore继续工作,而不再对旧的memStore写入数据,此时HBase会启动一个独立的线程,将旧的memStore中的数据写入到HDFS中的一个新的HFile中,最终将数据持久化保存在了HDFS中。

在不停的产生HFile过程中,同一个Store的先后产生的多个HFile中可能存在对同一个数据的多个不同的版本,其中旧的版本的数据很可能已经是失效的垃圾数据了,但是由于HDFS只能一次写入多次读取不支持行级别的增删改,这些垃圾数据无法及时清理。最终造成浪费存储空间,降低查询性能。

因此当HFile的数量达到一定的量,或达到一定的时间间隔,HBase将会触发HFile的合并操作,将同一个Store的先后产生的多个HFile合并成一个HFile,在合并的过程中,会将垃圾数据清理掉。而当不停的合并产生了达到一定大小的HFile后,HFile还会被拆分为若干个小的HFile,防止HFile过大。

这个过程中看似 先合并 又拆分,小到大 大到 小,其实 在这个过程集中,垃圾数据就被 清理掉了 。

问题2:内存断电丢数据怎么办
在HBase的HRegionServer中存在名为HLog的日志文件,在向memStore写入数据时,数据需要同时写入HLog中记录操作日志。
这个HLog文件本质上是存在于HDFS中的一个文件,通过对HDFS中的这个文件不停的追加数据记录操作日志。
而在memStore满了溢写到HFile中完成后,HBase会将最后一条持久化到HFile中的日志的编号记录到Zookeeper中redo point。
这样一旦断电丢失内存数据,只需要到Zookeeper中找到最后一条持久化的日志的编号,再从HLog中将这个编号之后的数据恢复到内存中即可以找回所有的数据。
为了防止HLog文件过多,分摊写入性能,HBase中一个HRegionServer一个HLog,这个HRegionServer中的所有的HRegion的日志都会记在这同一个HLog文件中。

HBase总结

为什么hbase可以很快:
内部有memStore做缓冲,读写都是有限基于内存实现的效率高
数据按照行键排序 查询效率高
数据从水平方向上切分为若干个HRegion 分布式的存储 提高效率

为什么hbase可以存储很多数据:
数据最终存储到HDFS上,而HDFS是分布式的存储系统,可以动态扩容,基本可以认为容量没有限制
空的数据不占用空间,当数据比较稀疏时,不会浪费空间
hbase按列存储数据,而同一个列中的数据数据结构往往类似,可以实现高效率的数据压缩,节省空间

为什么hbase的是可靠的:
数据最终存储在HDFS中,而HDFS自带多副本机制保证高可靠
存在多个HRegionServer,即使某些HRegionServer宕机,HBase也可以恢复数据到其他HRegionServer继续工作
HMaster提供了备用机制,自动在HMaster 和 BackUpHMaster之间切换

hbase和hive和传统的关系型数据库的比较:
比起传统的关系型数据库,可以存储半结构化非结构化的数据,可以存储和处理更大级别的数据,提供高效的查询,对于稀疏数据的处理更好,具有更好的横向扩展性,免费开源性价比很高。但是不能支持非常好的事务特性,只支持行级的事务。只能通过行键来查询,表设计时难度更高。而mysql用来存储结构化的数据提供更好的事务控制。
比起hive,hive只是在mapreduce上包了一层壳,本质上还是离线数据的处理的工具,实时查询性能有限,本质上是一个基于hadoop的数据仓库工具,不能支持行级别的新增修改和删除。hbase可以提供实时的数据的处理能力,具有完整的增删改查的能力,本质上是一种数据库工具。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值