文档章节

HBase文件索引分析

Poorzerg
 Poorzerg
发布于 2014/02/08 14:54
字数 1508
阅读 352
收藏 3

基于HBase 0.94.3分析

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中。

 

Put:

1、HRegion.put接口中,会先对通过checkResources() 函数对资源进行检测,如果HRegion的Memstore总大小超过了blockingMemStoreSize,就会进入flush操作,当前操作将会进入阻塞状态,知道memstoresize到达合适的范围内。

2、会对put中的Family进行检查,查看是否跟Table匹配。

3、如果需要将put操作写入到HLog中,将put写入

4、将Put操作写入到memstore中

5、如果memstore超过一定值,将会把memstore转换成StoreFile并flush到 HDFS中

6、如果Store中的StoreFile文件超过一定个数,会触发Compact合并操作,将合并多个StoreFile为一个,Compact合并过程中会进行版本合并和数据删除。这里可以看出HBase在平时只有数据的增加,所有的更新和删除操作都在Compact中进行,这将使用户的写操作进入到内存就可以立即返回了。

7、当StoreFiles Compact后,会逐步形成越来越大的StoreFile,当单个StoreFile大小超过一定阈值后,会触发Split操作,同时把当前Region Split成2个Region,父Region会下线,新Split出的2个孩子Region会被HMaster分配到相应的HRegionServer上,使得原先1个Region的压力得以分流到2个Region上。

 

Delete:[ 与Put类似 ]


© 著作权归作者所有

Poorzerg
粉丝 12
博文 21
码字总数 23485
作品 0
深圳
程序员
私信 提问
HBase2.0商用首发--有哪些值得期待的新特性

【HBase生态+Spark社区大群】 1.技术交流钉钉大群【强烈推荐!】 群内每周进行群直播技术分享及问答 加入方式1: 点击链接申请加入 https://dwz.cn/Fvqv066s 加入方式2: 钉钉扫码加入: 2....

HBase技术社区
2018/12/04
0
0
HBase技术双周刊第1期:HBase 在人工智能场景的使用

精彩直播 HBase多模式 HBase多模式,包括 分析层:支持复杂分析、算子下推;多模式层:提供各种模型转换,贴切业务;索引引擎:提供索引支持,基于 Lucene ;存储引擎:提供 KV 支持,基于L...

萌萌怪兽
2018/11/22
0
0
巨杉Tech | Hbase迁移至SequoiaDB 实战

背景 在传统银行 IT 架构中,联机交易与统计分析系统往往采用不同的技术与物理设备,通过定期执行的 ETL 将联机交易数据向分析系统中迁移。而作为数据服务资源池,同一份数据可能被不同类型的...

巨杉数据库
2019/09/18
34
0
云HBaseSQL及分析-Phoenix&Spark

在2018年1月的数据库直播大讲堂峰会HBase专场,来自阿里云的研发工程师瑾谦和沐远分享了云HBaseSQL以及分析Phoenix&Spark。本文介绍了详细了Phoinix和Spark的架构,适用性以及优缺点,并在最...

HBase技术社区
2018/06/05
0
0
阿里云EMR异步构建云HBase二级索引

一、非HA EMR构建二级索引 云HBase借助Phoenix实现二级索引功能,对于Phoenix二级索引的详细介绍可参考https://yq.aliyun.com/articles/536850?spm=a2c4e.11153940.blogrightarea544746.26.6...

shining0227
2018/09/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

ZhaoWei-2020-01-18

Redis官方文档 简介 Redis是开源的(BSD许可)内存数据结构存储,用作数据库,缓存和消息代理。它支持数据结构,例如 字符串,哈希,列表,集合,带范围查询的排序集合,位图,超日志,带有半...

SuSheePark
20分钟前
11
0
替换字符串C#中的换行符

如何在C#中替换字符串中的换行符? #1楼 由于新行可以用\\n , \\r和\\r\\n分隔,因此我们首先将\\r和\\r\\n替换为\\n ,然后才拆分数据字符串。 以下几行应转到parseCSV方法: function p...

javail
22分钟前
6
0
快递物流上门取件api接口对接指南(中通圆通申通韵达百世)

1.常用快递API 支持顺丰、EMS、申通、圆通、韵达、汇通、中通、天天、德邦、全峰等主流快递公司。 上门取件,是电商平台为寄件用户提供的通过一键下单到快递员,并在2小时上门取件的寄件服务...

程序的小猿
26分钟前
6
0
WebFlux系列(十一)WebClient 日志

#Java#Spring#WebClient#WebFlux#log#日志# WebClient 日志 视频讲解 : https://www.bilibili.com/video/av83627944/ WebfluxConsumerApplication.java package com.example.webfluxconsumer......

潘文海
28分钟前
6
0
使用LINQ来获取一个List <>中的项目,而不是另一个List <>中的项目

我会假设有一个简单的LINQ查询可以做到这一点,但我不确定该如何做。 给出这段代码: class Program{ static void Main(string[] args) { List<Person> peopleList1 = new...

技术盛宴
37分钟前
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部