HBase文件索引有什么用

11次阅读
没有评论

这篇文章将为大家详细讲解有关 HBase 文件索引有什么用,丸趣 TV 小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

HBase 总体结构图

 HBase 文件索引有什么用

 

部分术语简介

HMaster

负责管理 HRegionServer 的接入,负责 Region 的管理分配,负责管理 Table 的创建于删除修改等操作。

HRegion

每个 Table 可以分裂成多个 Region,每个 Region 为 Table 中的一个行区间。例如 RowKey 为 0 -100 的 Table,可以分裂成 0 -50 以及 51-100 这两个 Region。

HRegionServer

每个 HRegionServer 管理着多个 Region,负责对 Region 的读写操作等

HLog

每个 HRegionServer 都有一个 HLog 用来记录所有操作,主要用于数据损坏时修复数据。物理上是 Hadoop 的 Sequence File

Store

每个 HRegion 下管理着多个 Store,每个 Store 对应 Table 中的一个 Family 进行数据管理

StoreFile

Family 的持久化数据类

MemStore

每个 Store 中都有一个 MemStore,用来缓存对 Family 的操作,当 MemStore 缓存到一点大小之后,将会转换成 StoreFile Flush 到 HDFS 中

HFile

StoreFile 只是 HFile 的轻量级封装,HDFS 中保存的 Table 数据文件都是 HFile 格式

 

索引的总体结构

在 HBase 中,从整个大框架上来看,索引的分布分为以下几层。

HBase 文件索引有什么用 

A、在 Zookeeper 中,根据 HMaster 的启动,保存着分配了 -ROOT- Table 的 RegionServer 的地址。

B、在 -ROOT- Table 中,保存着.META Table split 成多个 region 后所分布在的 RegionServers 的信息。

C、在.META 中,保存着各个 Table 的 regions 所分布的 RegionServers 地址。

D、-ROOT- 只存在一个 Region,而.META 是可以 split 成多个的。

-ROOT- 与 META 的表结构是一样的,如下

Rowkey

info

Regioninfo

server

serverstartcode

TableName

StartKey

TimeStamp

Startkey

Endkey

family list

address

加载当前分片的启动时间

-ROOT- 示例:

假设.META 分裂成了两个 Region,分布在了两个 RegionServer 上

Rowkey

Info

Regioninfo

Server

serverstarcode

.META Table1

pk0

12345278

RegionServer1

.META Table1

pk1000

123451278

RegionServer2

.META Table2

pk0

123431278

RegionServer1

.META Table2

pk1000

123457278

RegionServer2

 HBase 文件索引有什么用

.META 的示例:

Rowkey

Info

Regioninfo

Server

serverstarcode

Table1

pk0

12345278

RegionServer1

Table1

pk1000

123451278

RegionServer2

Table1

pk2000

12345878

RegionServer3

……

……

……

……

Table2

pk0

12345278

RegionServer1

Table2

pk1000

12345478

RegionServer2

Table2

pk2000

12345778

RegionServer3

 HBase 文件索引有什么用

RegionServer 的定位过程

当 Client 要对一个 Table 中的数据进行 put、get、delete 操作时,提供了 TableName 以及 RowKey 时,Client 从 Zookeeper 中获取到 -ROOT- 的 RegionServer 信息,然后从 -ROOT- 中根据 RowKey 获取到.META 的 ReginoServer,从而再定位到 RowKey 所在的 RegionServer 中。由于 Client 在交互过程中会缓存 -ROOT-、.META、Region 等位置信息,在最优情况下只需要查询一次位置,在最坏情况下是需要 6 次 [需要从 Table Region 递归回去查询]。

HFile 的数据存储结构:

 HBase 文件索引有什么用

如上图,HFile 的文件长度为变长,其中的 File Info 以及 Trailer 是定长,Trailer 中有指向 File Info\Data Index\Meta Index 的起始点。Index 数据块记录着 Data\Meta 块的起始点。在 Data 数据块中,Magic 是用来辨别数据是否损坏的,每个 Data 块中保存着多个 KeyValue 信息。

 HBase 文件索引有什么用

上图为 KeyValue 的数据结构

 HBase 文件索引有什么用

上图也为 HFile 的数据结构

整个的 region 文件路径就是如下形式:

/ hbase-root-dir / tablename / encoded-regionname / column-family / filename

每个 column-family 下的一个个 HFile 数据文件,文件的名字是基于 Java 内建的随机数生成器产生的任意数字。代码会保证不会产生碰撞,比如当发现新生成的数字已经存在时,它会继续寻找一个未被使用的数字。

Region 的操作

当定位到 RowKey 所在的 RegionServer 之后,就能根据 RegionName 来获取到相对应的 Region,RegionName 来自.META 中保存的 RowKey。

Get:

1、HRegion.get 接口会先对 Family 做检测,保证 Get 中的 Family 与 Table 中的保持一致。

2、根据 Family 的信息,找出对应的 Store,并获取到 Store 中的 StoreScanner 实例,并将其添加到一个 scanners 队列中。

3、在 StoreScanner 中,又有 MemstoreScanner 和 HFileScanner 两个实例,分别用来遍历 MemStore 与 HFile 中的 keyValue 值的。

4、因为存在多个 HFile,因此会对 HFileScanner 会做一次过滤选择,通过 HFile 的 DataIndex 将 position 指向 StarRow,DataIndex 中是保存有当前 DataBlock 的 firstKey 信息的,如果 KeyValue 不在当前 HFile 中,将关闭 HFileScanner 的查找。

5、需要注意的是,在 RegionServer 启动之后,HFile 的 DataIndex 是保存在内存中的。

6、当 StoreScanner 查询相应的 keyValue 时,先利用 MemstoreScanner 从 MemStore 中查找,如果没有相应数据,再利用 HFileScanner 从 HFile 的 DataBlock 中遍历,DataIndex 能快速定位 Block 所在的位置。

7、由于 HFile 已经被持久化到 HDFS 中,对 HFile 的每次 IO 读取,都只是读取一个 Data 数据块的大小,Data 的位置可以根据 HFile 的 DataIndex 信息来查询。

8、如果有配置使用 Bloom Filters,将能快速确认一个 RowKey 或者 value 是否在一个 HFile 中。

关于“HBase 文件索引有什么用”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。