Hadoop大数据开发基础系列:十、HBase

第十章、HBase

一、HBase是什么?

1.概述
HBase是一个分布式的、面向列的开源数据库。
HBase不同于一般的关系数据库,它是一个 适合于非结构化数据存储的数据库。另一个不同的是 HBase基于列的而不是基于行的模式。
 
2.特点
(1)优点:
      容量大、良好的拓展性(可以动态增加多个节点增加计算和存储能力)、可靠性、高性能、列存储、可伸缩、实时读写、稀疏性(支持稀疏矩阵的存储)、多版本(后面会提到)、 有着Hadoop原生支持
(2)缺点:
     ①不支持复杂的聚合运算;②不支持二级索引;③不支持跨行事务,只支持单行事务。
 
3.HBase与Hadoop集群内其他组件的联系
(1)HBase位于结构化存储层
    

(2)HDFS为HBase提供了高可靠性的底层存储支持。
(3)MapReduce为HBase提供了高性能的计算能力。
(4)Zookeeper为HBase提供了稳定服务和failover机制
(5)phoenix和Hive提供了高层语言支持,便于HBase上进行数据统计处理。
(6)Sqoop为HBase提供了方便的RDBMS数据导入功能,便于其他传统数据库中数据向HBase中迁移。
 
4.HBase与RDBMS对比
 
 
HBase
RDBMS
数据类型
只有字符串(字节数组)
多种数据类型
数据操作
只支持增删改查
支持SQL语句
存储模式
基于列存储
基于行存储
数据更新
数据多版本
更新后覆盖原数据
扩展性
扩展性高,主要是横向扩展,通过不断增加廉价商用服务器,来增加计算和存储能力
扩展性有限
5.HBase中表的特点:
(1)存储数据量大
(2)面向列存储
(3)支持稀疏存储,而不占用大量空间
(4)HBase在创建表时是可以提前做分区的
 

二、HBase数据模型

从逻辑视图上,HBase中数据是以表的形式来存储的,表由行和列组成。
从物理视图上看,HBase是一个Map,由键值对组成,与普通的Map不同的是,HBase是一个稀疏的、分布式的、多维排序的Map。
 
1.逻辑模型
(1)rowkey:每一行有一个rowkey,作为表的主键。
关于rowkey的一些说明:
①访问HBase中的行,可以通过三种方式:通过单个row key访问;通过row key的range访问;全表扫描。
②row key可以是任意字符串(最大为64KB),在HBase内部,rowkey保存为字节数组。
③数据在存储时,是根据rowkey的字典序排序存储,在设计key的时候,要充分利用排序存储这一特性。
(2)Column Family: 列簇,包含一个或多个列。
列簇是表的schema的一部分(列不是),必须在使用表之前定义。
列名都是以列簇作为前缀的
(3)Column:列
(4)Cell:单元,在HBase中通过row和columns确定一个存储单元就是cell,cell中的数据是不指定类型的,全部都是以字节码形式存储。
(5)时间戳(timestamp)
对于时间戳的介绍:
①每个cell都保存着同一份数据的多个版本,版本通过时间戳来索引,每个cell中不同版本的数据按照时间倒序排序,即最新的数据排在最前面。
②时间戳可以由HBase自动赋值,也可以由客户显式赋值。
③HBase提供了 两种数据版本回收方式,一是保存数据的最后n个版本( 数量),二是保存最近一段时间的版本( 时间)。
 
2.物理模型
物理模型就是将逻辑模型的一个rowkey分割成根据Column family存储的模型。
下面的这个例子好好理解一下:

说明:
(1)在逻辑模型上有些列的位置是空白的,这样的列实际不会被存储,当请求这些空白的单元格式,会返回null值。
(2)如果在查询的时候不提供时间戳,那么会返回距离现在最近的一个版本的数据。
 

三、HBase系统架构

1.Client(主要是提供与HBase的交互)
(1)Client提供一些交互方式:Shell命令接口、原生Java API编程接口、Thrift/Rest API编程接口以及MapReduce编程接口。
(2)HBase在数据访问之前,首先通过 元数据表定位目标数据所在的RegionServer,之后才会发请求到RegionServer。同时这些元数据会缓存到客户端本地,方便再一次访问。
(3)如果集群 RegionServer发生宕机或者执行了负载均衡操作,从而 导致数据分片发生转移客户端需要重新请求最新的元数据并保存在本地
 
2.HMaster
(1)处理用户的管理请求,比如用户的增删改查请求。
(2)协调RegionServer
①为RegionServer分配Region。
②通过Zookeeper监控集群上所有的RegionServer的健康状态。
③发现失效的RegionServer,将失效Server上的Region进行重新分配。
(3)清理过期日志以及文件(HLog和HFile)
 
3.Zookeeper
(1)Zookeeper是一个分布式的协调服务
(2)Zookeeper 管理着HBase的核心元数据,如:HMaster和HRegionServer的状态(available/alive等),元数据表所在的 RS地址等 。
(3)Zookeeper 提供了宕机时通知功能(可以检测HRegionServer和HMaster的状态)
①HMaster和HRegionServer连接到 Zookeeper后创建 Ephemeral节点,并使用 Heartbeat机制维持这个节点的存活状态。
②HMaster可以通过Zookeeper上的Ephemearal节点 监控RS的存活状态
备用HMaster监控Ephemearal节点,如果处于active状态的HMaster宕机,则备用的HMaster收到通知后更换为active状态。
(4)实现分布式表锁
 
4.RegionServer功能与架构
(1) 响应用户I/O请求,向HDFS文件系统中读写数据;
(2)内部管理了 一系列HRegion对象,每个Hregion对应了Table中的一个Region;
(3)Hregion由 多个HStore组成每个HStore对应了Table的一个Column Family的存储;(数据存储的中间位置,刷写数据)
(4)在HBase中 每个Column Family就是一个集中的存储单元,因此设计时最好将具备 相似查询条件的列放在一个Column Family中,保证读写高效性。
(5)HRegionServer中都包含一个 WAL(write a head log)即HLog,用于保存还未持久化存储的数据, 可以用于数据的还原
这里着重说一下 HLog在HBase中起到的核心作用
①实现数据的高可靠性:
HBase的数据写入不是直接写入HFile,而是先写入缓存,再异步刷新到磁盘。为了防止数据丢失,数据写入缓存之前需要先写入HLog,这样可以通过HLog即可恢复丢失的数据。(注意这个写入方式是可以更改的,可以选择不写入HLog,这样会增加写入效率但是会降低安全性)
②用于实现HBase集群间数据的同步:
通过回放主机群推送过来的HLog日志可以实现主从集群间数据的同步(速度很快)。
(6)HRegionServer还用于 切分过大的Region
(7)下图为HRegionServer的架构图:
(8)HFile:HBase中的 keyvalue数据存储格式,HFile是Hadoop的二进制格式文件。
(9)BlockCache是HBase的读缓存,每个RS对应一个BlockCache
①客户端从磁盘读取数据时会把数据缓存到内存中,后续访问这些数据可以直接从内存读取,大大提高了性能。
②BlockCache缓存的对象是一个个的Block块(64KB),在物理上是由多个key-value组成。当前的BlockCache实现方式有:LRUBlockCache和BucketCache,后者在GC优化方面有明显的提升。
 
5.Region
(1) HBase使用RowKey将表“水平切割”成多个Region,Region代表的是数据表的一个分片,也是集群负 载均衡的基本单位,通常一张表的Region会分布在整个集群的多个RS上,一个RS上会存在多个Region, 当然这些Region一般来自不同的数据表。( 也就是实现了物理上是列存储结构,但是逻辑上是行存储结构
(2)从HMaster的角度,每个HRegion都 纪录了它的StartKey 和EndKey。由于 RowKey是排序的,因而Client可以通过HMaster 快速的定位每个RowKey在哪个HRegion中。
(3)每个HRegionServer可以同时管理1000个左右的HRegion。
 

四、HBase中关键算法与读写流程

1.HBase的meta(元标签)表
scan 'hbase:meta',{FILTER=>"(PrefixFilter('tsdb'))"} 查看
下面是一些相关信息:
 
2.HBase的写数据流程
总的来说,写入流程包括三个阶段:
客户端处理阶段、Region写入阶段、MemStore Flush阶段
(1)客户端处理
客户端将用户的写入请求 进行预处理,并根据 集群元数据(到HBase:meta中查找rowkey)定位写入数据所在的RegionServer,将请求发送给对应的regionServer。
客户端查询HBase:meta表的具体细节:
①首先查询本地的cache是否有要查找的信息位置;
②如果没有查到,则去Zookeeper节点找应该在哪个RegionServer上查询到HBase:meta信息( 定位RegionServer);
③找到meta表后,Client向HRegionServer中发送查询请求,查询rowkey所在的region信息;
④收到返回结果之后, 将结果缓存至本地,以备下次使用。
(2)Region写入
RegionServer接收到写入请求之后将数据解析出来, 首先写入WAL再写入对应的region列簇的 MemStore(可能有多个)。 【其实到这里系统就会将写入成功的信息返回到客户端】
(3) MemStore[HStore]  Flush阶段(异步操作)
当Region中的MemStore容量超过一定阈值,系统会异步 执行flush操作,将内存中的数据写入文件,形成HFile。
 
3.第一次读取数据的流程
(1 ) 从ZooKeeper(/hbase/meta-region-server)中获取hbase:meta的位置(HRegionServer的位置),缓
存该位置信息。
(2) 从HBase:meta中查询用户Table对应请求的RowKey所在的HRegionServer,缓存该位置信息。
(3)从查询到HRegionServer中读取Row。
 
4.HBase Compaction
随着HFile文件数量的不断增多,查询可能需要越来越多的IO操作,读取延迟会越来越大。
执行 Compaction会使文件个数基本稳定,进而读取IO的次数比较稳定,延迟就会稳定在 一定范围。
Compaction的两种方式
(1)Minor-Compaction
HBase会自动 拾取一些较小的HFiles,并将它们重新写入一些较大的HFiles中。 Minor compaction不会处理已经Deleted或Expired的Cell。
(2)Major-Compaction
①将Region 上一个列族对应的多个HFile 合并为一个大的HFile文件
②删除过期数据,被删除数据。
③改善HBase读取效率。
④会引起磁盘IO和网络资源的紧缺。
⑤可以被设置为周期执行。
发布了18 篇原创文章 · 获赞 0 · 访问量 503

第十章、HBase

猜你喜欢

转载自blog.csdn.net/weixin_45678149/article/details/104943561
今日推荐