这篇文章将为大家详细讲解有关 HBase 文件索引有什么用,丸趣 TV 小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
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 中,从整个大框架上来看,索引的分布分为以下几层。
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
.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
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 的数据存储结构:
如上图,HFile 的文件长度为变长,其中的 File Info 以及 Trailer 是定长,Trailer 中有指向 File Info\Data Index\Meta Index 的起始点。Index 数据块记录着 Data\Meta 块的起始点。在 Data 数据块中,Magic 是用来辨别数据是否损坏的,每个 Data 块中保存着多个 KeyValue 信息。
上图为 KeyValue 的数据结构
上图也为 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 文件索引有什么用”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。