【HBase】(二) HBase架构以及读写

一、 HBase架构

在这里插入图片描述

1、相关概念

Client: 包含访问Hbase的接口维护cache来加快Hbase访问

Zookeeper: 保证任何时候集群中只有一个master,保证所有的Region的寻址入口,实时监控Region Server的上下线,并通知Master。存储Hbase的schema和表元数据,分担客户端的请求,先连zk

Master: 为RegionServer分配Region,负责RegionServer的负载均衡,发现失效的RegionServer并重新分配到其他的Region Server工作。

Region Server: 维护多个region,处理对这些region的IO请求,真正的增删改查操作;水平切分运行中变得过大的region,合并小的Region,维护多个Region

HLog: 预写入日志。记录数据,以及数据的操作。目的是为了数据容灾,防止数据丢失

HRegion: 每个Hregion保存表中某段连续的数据(多行),每个表对应一个或多个region,随着数据量的不断增加,region增大,到达阈值,region就会被region server水平切分成两个新的region,region很多时就会保存到其他的region Server

Store: 一个region由多个store组成,每个store对应一个列簇,store包含mestore和storefile

Memstore: 内存缓存区,数据的写操作会先到memstore中,写缓存,由于 HFile 中的数据要求是有序的,所以数据是先存储在 MemStore 中,排好序后,等到达刷写时机(一定的时间,一定的数量)才会刷写到 HFile,每次刷写都会形成一个新的 HFile。

StroreFile: 当StoreFile数量增加到阈值后,系统会合并,合并过程会进行版本的合并和删除工作,形成更大的StoreFile(优化一般主要针对major 合并),当一个region所有的StoreFile大小和数量增长到一定的阈值后,会把当前的region分割为两个,并且有Master分配到相应的RegionServer服务器,实现负载均衡,客户端检索数据,先在Memstore找,然后再去StoreFile

Hfile: 特殊的文件存储格式,键值对(K,V)的形式

2、HBase 有两张特殊表:

.META.:记录了用户所有表拆分出来的的 Region 映射信息,.META.可以有多个 Regoin

-ROOT-:记录了.META.表的 Region 信息,-ROOT-只有一个 Region,无论如何不会分裂
在这里插入图片描述

3、MemStore Flush

在这里插入图片描述
MemStore 刷写时机:
   1.当某个 memstroe 的大小达到了hbase.hregion.memstore.flush.size(默认值 128M),其所在 region 的所有 memstore 都会刷写。 当 memstore 的大小达到了

hbase.hregion.memstore.flush.size(默认值 128M) 
hbase.hregion.memstore.block.multiplier(默认值 4)

时,会阻止继续往该 memstore 写数据。
  2.当 region server 中 memstore 的总大小达到java_heapsize

hbase.regionserver.global.memstore.size(默认值 0.4)
hbase.regionserver.global.memstore.size.lower.limit(默认值 0.95)

region 会按照其所有 memstore 的大小顺序(由大到小)依次进行刷写。直到 region server中所有 memstore 的总大小减小到上述值以下。 当 region server 中 memstore 的总大小达到hbase.regionserver.global.memstore.size(默认值 0.4)
时,会阻止继续往所有的 memstore 写数据。
  3. 到达自动刷写的时间,也会触发 memstore flush。自动刷新的时间间隔由该属性进行配置 hbase.regionserver.optionalcacheflushinterval(默认 1 小时)。
  4.当 WAL 文件的数量超过 hbase.regionserver.max.logs,region 会按照时间顺序依次进行刷写,直到 WAL 文件数量减小到 hbase.regionserver.max.log 以下(该属性名已经废弃,现无需手动设置,最大值为 32)。

4、StoreFile Compaction

在这里插入图片描述
  由于memstore每次刷写都会生成一个新的HFile,且同一个字段的不同版本(timestamp)和不同类型(Put/Delete)有可能会分布在不同的 HFile 中,因此查询时需要遍历所有的 HFile。为了减少 HFile 的个数,以及清理掉过期和删除的数据,会进行 StoreFile Compaction。
  Compaction 分为两种,分别是Minor CompactionMajor Compaction。Minor Compaction会将临近的若干个较小的 HFile 合并成一个较大的 HFile,但不会清理过期和删除的数据。Major Compaction 会将一个 Store 下的所有的 HFile 合并成一个大 HFile,并且会清理掉过期和删除的数据

5、Region Split

在这里插入图片描述
  默认情况下,每个 Table 起初只有一个 Region,随着数据的不断写入,Region 会自动进
行拆分。刚拆分时,两个子 Region 都位于当前的 Region Server,但处于负载均衡的考虑,
HMaster 有可能会将某个 Region 转移给其他的 Region Server。
  Region Split 时机:
  1.当1个region中的某个Store下所有StoreFile的总大小超过hbase.hregion.max.filesize, 该 Region 就会进行拆分(0.94 版本之前)。
  2. 当 1 个 region 中 的 某 个 Store 下所有 StoreFile 的 总 大 小 超 过 Min(R^2 * "hbase.hregion.memstore.flush.size",hbase.hregion.max.filesize"),该 Region 就会进行拆分,其中 R 为当前 Region Server 中属于该 Table 的个数(0.94 版本之后)。

二、写流程

在这里插入图片描述
  写流程:
1)Client 先访问 zookeeper,获取 hbase:meta 表位于哪个 Region Server。 2)访问对应的 Region Server,获取 hbase:meta 表,根据读请求的 namespace:table/rowkey,
查询出目标数据位于哪个 Region Server 中的哪个 Region 中。并将该 table 的 region 信息以
及 meta 表的位置信息缓存在客户端的 meta cache,方便下次访问。
3)与目标 Region Server 进行通讯;
4)将数据顺序写入(追加)到 WAL;
5)将数据写入对应的 MemStore,数据会在 MemStore 进行排序;
6)向客户端发送 ack;
7)等达到 MemStore 的刷写时机后,将数据刷写到 HFile。

三、读流程

在这里插入图片描述
  读流程
1)Client 先访问 zookeeper,获取 hbase:meta 表位于哪个 Region Server。 2)访问对应的 Region Server,获取 hbase:meta 表,根据读请求的namespace:table/rowkey,查询出目标数据位于哪个 Region Server 中的哪个 Region 中。并将该 table 的 region 信息以及 meta 表的位置信息缓存在客户端的 meta cache,方便下次访问。
3)与目标 Region Server 进行通讯;
4)分别在 Block Cache(读缓存),MemStore 和 Store File(HFile)中查询目标数据,并将查到的所有数据进行合并。此处所有数据是指同一条数据的不同版本(time stamp)或者不同的类型(Put/Delete)。
5) 将从文件中查询到的数据块(Block,HFile 数据存储单元,默认大小为64KB)缓存到Block Cache。
6)将合并后的最终结果返回给客户端。

发布了27 篇原创文章 · 获赞 19 · 访问量 1289

猜你喜欢

转载自blog.csdn.net/weixin_42804692/article/details/105545689