HBase的组成


文章目录

  • HBase的组成
  • 大表的拆分
  • HBase 的组件
  • HBase架构图
  • HBase工作原理
  • 整体工作流程
  • 具体流程之写入
  • 具体流程之读取



首先HBase 的目标是存储并处理大型的数据,更具体来说是仅需使用普通的硬件配置,就能够处理由成千上万的行和列所组成的大型数据。

我们可以想象一张超级超级大的表,可能有几千列几亿行,这个数据量十分庞大,为了进行分布式存储和处理,所以我们要把表进行拆分。

根据拆分的逻辑就有了HBase的组成:

大表的拆分

Hbase建表自定义切分点时指定的数字是什么 hbase核心切分流程_hbase

也正是如上图所示的列拆分,所以HBase是面向列存储的数据库

HBase 的组件

Hbase建表自定义切分点时指定的数字是什么 hbase核心切分流程_hdfs_02

HMaster
1.监控RegionServer
2.处理RegionServer故障转移
3.处理元数据的变更
4.处理region的分配或转移
5.在空闲时间进行数据的负载均衡
6.通过Zookeeper发布自己的位置给客户端
RegionServer
1.负责存储HBase的实际数据
2.处理分配给它的Region
3.刷新缓存到HDFS
4.维护Hlog
5.执行压缩
6.负责处理Region分片

1.Write-Ahead logs

HBase的修改记录,当对HBase读写数据的时候,数据不是直接写进磁盘,它会在内存中保留一段时间(时间以及数据量阈值可以设定)。但把数据保存在内存中可能有更高的概率引起数据丢失,为了解决这个问题,数据会先写在一个叫做Write-Ahead logfile的文件中,然后再写入内存中。所以在系统出现故障的时候,数据可以通过这个日志文件重建。

2.Region

Hbase表的分片,HBase表会根据RowKey值被切分成不同的region存储在RegionServer中,在一个RegionServer中可以有多个不同的region。

3.Store

HFile存储在Store中,一个Store对应HBase表中的一个列族。

4.MemStore

顾名思义,就是内存存储,位于内存中,用来保存当前的数据操作,所以当数据保存在WAL中之后,RegsionServer会在内存中存储键值对。

5.HFile

这是在磁盘上保存原始数据的实际的物理文件,是实际的存储文件。StoreFile是以Hfile的形式存储在HDFS的。

HBase架构图

Hbase建表自定义切分点时指定的数字是什么 hbase核心切分流程_分布式_03

1)Client

Client包含了访问Hbase的接口,另外Client还维护了对应的cache来加速Hbase的访问,比如cache的.META.元数据的信息。

2)Zookeeper

HBase通过Zookeeper来做master的高可用、RegionServer的监控、元数据的入口以及集群配置的维护等工作。具体工作如下:

  • 通过Zoopkeeper来保证集群中只有1个master在运行,如果master异常,会通过竞争机制产生新的master提供服务
  • 通过Zoopkeeper来监控RegionServer的状态,当RegionSevrer有异常的时候,通过回调的形式通知Master RegionServer上下线的信息
  • 通过Zoopkeeper存储元数据的统一入口地址

3)Hmaster

master节点的主要职责如下:

  • 为RegionServer分配Region
  • 维护整个集群的负载均衡
  • 维护集群的元数据信息
  • 发现失效的Region,并将失效的Region分配到正常的RegionServer上
  • 当RegionSever失效的时候,协调对应Hlog的拆分

4)HregionServer

HregionServer直接对接用户的读写请求,是真正的“干活”的节点。它的功能概括如下:

  • 管理master为其分配的Region
  • 处理来自客户端的读写请求
  • 负责和底层HDFS的交互,存储数据到HDFS
  • 负责Region变大以后的拆分
  • 负责Storefile的合并工作

5)HDFS

HDFS为Hbase提供最终的底层数据存储服务,同时为HBase提供高可用(Hlog存储在HDFS)的支持,具体功能概括如下:
提供元数据和表数据的底层分布式存储服务
数据多副本,保证的高可靠和高可用性

HBase工作原理

客户端访问数据时的“三级寻址”

由于HBase是分布式数据库,所以具体的数据存在那台服务器上需要通过元数据来记录,在HBase中,元数据是存储服务器集群中某一个节点(HMaster)中的meta表中的,那么问题来了,当客户端需要请求某个数据时,首先要解决一个问题,就是在哪台服务器上找到元数据表,要解决这个问题很简单,zookeeper可以存储集群中共同维护的关键信息并以此完成高可用HA,所以将存储了meta table所在的节点信息即meta-region-server交给zookeeper来进行管理。

Hbase建表自定义切分点时指定的数字是什么 hbase核心切分流程_hbase_04

我们可以通过查看zookeeper的节点信息找到meta-region-server

Hbase建表自定义切分点时指定的数字是什么 hbase核心切分流程_分布式_05

Hbase建表自定义切分点时指定的数字是什么 hbase核心切分流程_大数据_06

整体工作流程

Hbase建表自定义切分点时指定的数字是什么 hbase核心切分流程_hdfs_07

具体流程之写入

Hbase建表自定义切分点时指定的数字是什么 hbase核心切分流程_大数据_08

  1. 客户端根据meta表向region-server发送写入数据
  2. region-server根据写入数据的数据标识找到其所在的分区,即region
  3. region-server为了数据不丢失,先把数据写入HLog(图像好像画错了,偷懒没有重新画)
  4. region通过分析写入数据所在列族找到对应的store并写入store中的MemStore(写缓存,相当于一个内存空间)
  5. 反馈客户端写成功的信息
  6. MemStore向HFile写入数据(溢写操作flush)
  7. HFile和HLog等待系统空闲时把数据Put到HDFS文件系统中

注意

memory store 又称为写缓存,因为只有在写入数据的时候,数据才会经过它,而读数据的时候,数据不会经过它。这是为了避免memory store中的数据重复.

那读数据的时候没有缓存么?

BlockCache才是读缓存

具体流程之读取

第一次查询

Hbase建表自定义切分点时指定的数字是什么 hbase核心切分流程_大数据_09

前面1、2、3与写的操作相同,主要关注后面几步

  1. 考虑到之前写入的数据最有可能被查询,所以先向查询写缓存MemStore有没有相关数据
  2. 如果没有在MemStore里找到数据就去HFile里面找数据
  3. HFile会将找到的数据传递给读缓存,这时读缓存BlockCache里就有内容了
  4. 读缓存将数据交付给客户端

第二次查询

Hbase建表自定义切分点时指定的数字是什么 hbase核心切分流程_hbase_10

  1. 因为第一次查询的时候向BlockCache里写入数据,所以在MemoryStore没有找到数据的时候会从读缓存中查找数据
  2. 如果读缓存里还是没有相关数据则从HFile里面查找数据,HFile会将相关数据交给BlockCache
  3. BlockCache向客户端交付数据