51CTO首页
AI.x社区
博客
学堂
精品班
软考社区
免费课
企业培训
鸿蒙开发者社区
WOT技术大会
IT证书
公众号矩阵
移动端

HBase原理–所有Region切分的细节都在这里了

开发 前端
HBase系统中Region自动切分是如何实现的?这里面涉及很多知识点,比如Region切分的触发条件是什么?Region切分的切分点在哪里?如何切分才能最大的保证Region的可用性?如何做好切分过程中的异常处理?切分过程中要不要将数据移动?

Region自动切分是HBase能够拥有良好扩张性的最重要因素之一,也必然是所有分布式系统追求***扩展性的一副良药。HBase系统中Region自动切分是如何实现的?这里面涉及很多知识点,比如Region切分的触发条件是什么?Region切分的切分点在哪里?如何切分才能***的保证Region的可用性?如何做好切分过程中的异常处理?切分过程中要不要将数据移动?等等,这篇文章将会对这些细节进行基本的说明,一方面可以让大家对HBase中Region自动切分有更加深入的理解,另一方面如果想实现类似的功能也可以参考HBase的实现方案。

Region切分触发策略

在***稳定版(1.2.6)中,HBase已经有多达6种切分触发策略。当然,每种触发策略都有各自的适用场景,用户可以根据业务在表级别选择不同的切分触发策略。常见的切分策略如下图:

HBase原理–所有Region切分的细节都在这里了

ConstantSizeRegionSplitPolicy:0.94版本前默认切分策略。这是最容易理解但也最容易产生误解的切分策略,从字面意思来看,当region大小大于某个阈值(hbase.hregion.max.filesize)之后就会触发切分,实际上并不是这样,真正实现中这个阈值是对于某个store来说的,即一个region中***store的大小大于设置阈值之后才会触发切分。另外一个大家比较关心的问题是这里所说的store大小是压缩后的文件总大小还是未压缩文件总大小,实际实现中store大小为压缩后的文件大小(采用压缩的场景)。ConstantSizeRegionSplitPolicy相对来来说最容易想到,但是在生产线上这种切分策略却有相当大的弊端:切分策略对于大表和小表没有明显的区分。阈值(hbase.hregion.max.filesize)设置较大对大表比较友好,但是小表就有可能不会触发分裂,极端情况下可能就1个,这对业务来说并不是什么好事。如果设置较小则对小表友好,但一个大表就会在整个集群产生大量的region,这对于集群的管理、资源使用、failover来说都不是一件好事。

I ncreasingToUpperBoundRegionSplitPolicy : 0.94版本~2.0版本默认切分策略。这种切分策略微微有些复杂,总体来看和ConstantSizeRegionSplitPolicy思路相同,一个region中***store大小大于设置阈值就会触发切分。但是这个阈值并不像ConstantSizeRegionSplitPolicy是一个固定的值,而是会在一定条件下不断调整,调整规则和region所属表在当前regionserver上的region个数有关系 :(#regions) * (#regions) * (#regions) * flush size * 2,当然阈值并不会***增大,***值为用户设置的MaxRegionFileSize。这种切分策略很好的弥补了ConstantSizeRegionSplitPolicy的短板,能够自适应大表和小表。而且在大集群条件下对于很多大表来说表现很优秀,但并不***,这种策略下很多小表会在大集群中产生大量小region,分散在整个集群中。而且在发生region迁移时也可能会触发region分裂。

SteppingSplitPolicy: 2.0版本默认切分策略。这种切分策略的切分阈值又发生了变化,相比 IncreasingToUpperBoundRegionSplitPolicy 简单了一些,依然和待分裂region所属表在当前regionserver上的region个数有关系,如果region个数等于1,切分阈值为flush size * 2,否则为MaxRegionFileSize。这种切分策略对于大集群中的大表、小表会比 IncreasingToUpperBoundRegionSplitPolicy 更加友好,小表不会再产生大量的小region,而是适可而止。

另外,还有一些其他分裂策略,比如使用DisableSplitPolicy:可以禁止region发生分裂;而KeyPrefixRegionSplitPolicy,DelimitedKeyPrefixRegionSplitPolicy对于切分策略依然依据默认切分策略,但对于切分点有自己的看法,比如KeyPrefixRegionSplitPolicy要求必须让相同的PrefixKey待在一个region中。

在用法上,一般情况下使用默认切分策略即可,也可以在cf级别设置region切分策略,命令为:

  1. create ’table’, {NAME => ‘cf’, SPLIT_POLICY => ‘org.apache.hadoop.hbase.regionserver. ConstantSizeRegionSplitPolicy'} 

Region切分准备工作-寻找SplitPoint

region切分策略会触发region切分,切分开始之后的***件事是寻找切分点-splitpoint。所有默认切分策略,无论是ConstantSizeRegionSplitPolicy、 IncreasingToUpperBoundRegionSplitPolicy 抑或是SteppingSplitPolicy,对于切分点的定义都是一致的。当然,用户手动执行切分时是可以指定切分点进行切分的,这里并不讨论这种情况。

那切分点是如何定位的呢? 整个region中***store中的***文件中最中心的一个block的***rowkey 。这是一句比较消耗脑力的语句,需要细细品味。另外,HBase还规定,如果定位到的rowkey是整个文件的***rowkey或者***一个rowkey的话,就认为没有切分点。

什么情况下会出现没有切分点的场景呢?最常见的就是一个文件只有一个block,执行split的时候就会发现无法切分。很多新同学在测试split的时候往往都是新建一张新表,然后往新表中插入几条数据并执行一下flush,再执行split,奇迹般地发现数据表并没有真正执行切分。原因就在这里,这个时候仔细的话你翻看debug日志是可以看到这样的日志滴:

HBase原理–所有Region切分的细节都在这里了

Region核心切分流程

HBase将整个切分过程包装成了一个事务,意图能够保证切分事务的原子性。整个分裂事务过程分为三个阶段:prepare – execute – (rollback) ,操作模版如下:

HBase原理–所有Region切分的细节都在这里了

  • prepare阶段:在内存中初始化两个子region,具体是生成两个HRegionInfo对象,包含tableName、regionName、startkey、endkey等。同时会生成一个transaction journal,这个对象用来记录切分的进展,具体见rollback阶段。
  • execute阶段:切分的核心操作。见下图(来自 Hortonworks ):

HBase原理–所有Region切分的细节都在这里了

  1. regionserver 更改ZK节点 /region-in-transition 中该region的状态为SPLITING。
  2. master通过watch节点/region-in-transition检测到region状态改变,并修改内存中region的状态,在master页面RIT模块就可以看到region执行split的状态信息。
  3. 在父存储目录下新建临时文件夹.split保存split后的daughter region信息。
  4. 关闭parent region:parent region关闭数据写入并触发flush操作,将写入region的数据全部持久化到磁盘。此后短时间内客户端落在父region上的请求都会抛出异常NotServingRegionException。
  5. 核心分裂步骤:在.split文件夹下新建两个子文件夹,称之为daughter A、daughter B,并在文件夹中生成reference文件,分别指向父region中对应文件。这个步骤是所有步骤中最核心的一个环节,生成reference文件日志如下所示:
  1. 2017-08-12 11:53:38,158 DEBUG [StoreOpener-0155388346c3c919d3f05d7188e885e0-1] regionserver.StoreFileInfo: reference 'hdfs://hdfscluster/hbase-rsgroup/data/default/music/0155388346c3c919d3f05d7188e885e0/cf/d24415c4fb44427b8f698143e5c4d9dc.00bb6239169411e4d0ecb6ddfdbacf66' to region=00bb6239169411e4d0ecb6ddfdbacf66 hfile=d24415c4fb44427b8f698143e5c4d9dc。 

其中reference文件名为d24415c4fb44427b8f698143e5c4d9dc.00bb6239169411e4d0ecb6ddfdbacf66,格式看起来比较特殊,那这种文件名具体什么含义呢?那来看看该reference文件指向的父region文件,根据日志可以看到,切分的父region是00bb6239169411e4d0ecb6ddfdbacf66,对应的切分文件是d24415c4fb44427b8f698143e5c4d9dc,可见reference文件名是个信息量很大的命名方式,如下所示:

HBase原理–所有Region切分的细节都在这里了

除此之外,还需要关注reference文件的文件内容,reference文件是一个引用文件(并非linux链接文件),文件内容很显然不是用户数据。文件内容其实非常简单,主要有两部分构成:其一是切分点 splitkey,其二是一个boolean类型的变量(true或者false),true表示该reference文件引用的是父文件的上半部分(top),而false表示引用的是下半部分 (bottom)。为什么存储的是这两部分内容?且听下文分解。

看官可以使用hadoop命令 亲自来查看reference文件的具体内容:

  1. hadoop dfs -cat /hbase-rsgroup/data/default/music/0155388346c3c919d3f05d7188e885e0/cf/d24415c4fb44427b8f698143e5c4d9dc.00bb6239169411e4d0ecb6ddfdbacf66 

6. 父region分裂为两个子region后, 将daughter A、daughter B拷贝到HBase根目录下,形成两个新的region。

7. parent region通知修改 hbase.meta 表后下线,不再提供服务。下线后parent region在meta表中的信息并不会马上删除,而是标注split列、offline列为true,并记录两个子region。为什么不立马删除?且听下文分解。

HBase原理–所有Region切分的细节都在这里了

8. 开启daughter A、daughter B两个子region。通知修改 hbase.meta 表,正式对外提供服务。

HBase原理–所有Region切分的细节都在这里了

rollback阶段:如果execute阶段出现异常,则执行rollback操作。为了实现回滚,整个切分过程被分为很多子阶段,回滚程序会根据当前进展到哪个子阶段清理对应的垃圾数据。代码中使用 JournalEntryType 来表征各个子阶段,具体见下图:

HBase原理–所有Region切分的细节都在这里了

Region切分事务性保证

整个region切分是一个比较复杂的过程,涉及到父region中HFile文件的切分、两个子region的生成、系统meta元数据的更改等很多子步骤,因此必须保证整个切分过程的事务性,即要么切分完全成功,要么切分完全未开始,在任何情况下也不能出现切分只完成一半的情况。

为了实现事务性,hbase设计了使用状态机(见SplitTransaction类)的方式保存切分过程中的每个子步骤状态,这样一旦出现异常,系统可以根据当前所处的状态决定是否回滚,以及如何回滚。遗憾的是,目前实现中这些中间状态都只存储在内存中,因此一旦在切分过程中出现regionserver宕机的情况,有可能会出现切分处于中间状态的情况,也就是RIT状态。这种情况下需要使用hbck工具进行具体查看并分析解决方案。在2.0版本之后,HBase实现了新的分布式事务框架Procedure V2(HBASE-12439),新框架将会使用HLog存储这种单机事务(DDL操作、Split操作、Move操作等)的中间状态,因此可以保证即使在事务执行过程中参与者发生了宕机,依然可以使用HLog作为协调者对事务进行回滚操作或者重试提交,大大减少甚至杜绝RIT现象。这也是是2.0在可用性方面最值得期待的一个亮点!!!

Region切分对其他模块的影响

通过region切分流程的了解,我们知道整个region切分过程并没有涉及数据的移动,所以切分成本本身并不是很高,可以很快完成。切分后子region的文件实际没有任何用户数据,文件中存储的仅是一些元数据信息-切分点rowkey等,那通过引用文件如何查找数据呢?子region的数据实际在什么时候完成真正迁移?数据迁移完成之后父region什么时候会被删掉?

1. 通过reference文件如何查找数据?

这里就会看到reference文件名、文件内容的实际意义啦。整个流程如下图所示:

HBase原理–所有Region切分的细节都在这里了

(1)根据reference文件名(region名+真实文件名)定位到真实数据所在文件路径

(2)定位到真实数据文件就可以在整个文件中扫描待查KV了么?非也。因为reference文件通常都只引用了数据文件的一半数据,以切分点为界,要么上半部分文件数据,要么下半部分数据。那到底哪部分数据?切分点又是哪个点?还记得上文又提到reference文件的文件内容吧,没错,就记录在文件中。

2. 父region的数据什么时候会迁移到子region目录?

答案是子region发生major_compaction时。我们知道compaction的执行实际上是将store中所有小文件一个KV一个KV从小到大读出来之后再顺序写入一个大文件,完成之后再将小文件删掉,因此compaction本身就需要读取并写入大量数据。子region执行major_compaction后会将父目录中属于该子region的所有数据读出来并写入子region目录数据文件中。可见将数据迁移放到compaction这个阶段来做,是一件顺便的事。

3. 父region什么时候会被删除?

实际上HMaster会启动一个线程定期遍历检查所有处于splitting状态的父region,确定检查父region是否可以被清理。检测线程首先会在meta表中揪出所有split列为true的region,并加载出其分裂后生成的两个子region(meta表中splitA列和splitB列), 只需要检查此两个子region是否还存在引用文件,如果都不存在引用文件就可以认为该父region对应的文件可以被删除。现在再来看看上文中父目录在meta表中的信息,就大概可以理解为什么会存储这些信息了:

 

 

HBase原理–所有Region切分的细节都在这里了

4. split模块在生产线的一些坑?

有些时候会有同学反馈说集群中部分region处于长时间RIT,region状态为spliting。通常情况下都会建议使用hbck看下什么报错,然后再根据hbck提供的一些工具进行修复,hbck提供了部分命令对处于split状态的rit region进行修复,主要的命令如下:

 

  1. -fixSplitParents  Try to force offline split parents to be online. 
  2.   -removeParents    Try to offline and sideline lingering parents and keep daughter regions. 
  3.   -fixReferenceFiles  Try to offline lingering reference store files 

其中最常见的问题是 :

  1. ERROR: Found lingering reference file hdfs://mycluster/hbase/news_user_actions/3b3ae24c65fc5094bc2acfebaa7a56de/meta/0f47cda55fa44cf9aa2599079894aed6.b7b3faab86527b88a92f2a248a54d3dc” 

简单解释一下,这个错误是说reference文件所引用的父region文件不存在了,如果查看日志的话有可能看到如下异常:

  1. java.io.IOException: java.io.IOException: java.io.FileNotFoundException: File does not exist:/hbase/news_user_actions/b7b3faab86527b88a92f2a248a54d3dc/meta/0f47cda55fa44cf9aa2599079894aed 

父region文件为什么会莫名其妙不存在?经过和朋友的讨论,确认有可能是因为官方bug导致,详见HBASE-13331。这个jira是说HMaster在确认父目录是否可以被删除时,如果检查引用文件(检查是否存在、检查是否可以正常打开)抛出IOException异常,函数就会返回没有引用文件,导致父region被删掉。正常情况下应该保险起见返回存在引用文件,保留父region,并打印日志手工介入查看。如果大家也遇到类似的问题,可以看看这个问题,也可以将修复patch打到线上版本或者升级版本。

责任编辑:未丽燕 来源: 有态度的HBase
相关推荐
HBase Region自动切分所有细节都在这里
这篇文章将会对这些细节进行基本的说明,一方面可以让大家对HBase中Region自动切分有更加深入的理解,另一方面如果想实现类似的功能也可以参考HBase的实现方案。

2017-12-08 10:42:49

HBase 切分 细节
关于直播,所有的技术细节都在这里(四)
基于可控和容灾的需要,移动端代码一般不会hardcode推流、播放的服务器IP地址,而选用域名代替。在IP出现宕机或网络中断的情况下,还可以通过变更DNS来实现问题IP的剔除。

2016-05-20 11:26:54

客户端优化 直播推流
关于直播,所有的技术细节都在这里(三)
一个典型的视频帧序列为IBBPBBPBBP……对于直播而言,为了减少直播的延时,通常在编码时不使用B帧。P帧B帧对于I帧都有直接或者间接的依赖关系,所以播放器要解码一个视频帧序列,并进行播放,必须首先解码出I帧,其后续的B帧和P帧才能进行解码,这样服务端如何进行关键帧的缓存,则对直播的延时以及其他方面有非常大的影响。

2016-05-20 11:14:55

内容缓存 传输策略优
Android字体修改,所有细节都在这里 | 开篇
Android系统默认使用的是一款叫做Robote的字体。Robote本身就是Google自己的字体格式,Android和Chrome操作系统上,默认都会使用Robote字体,并且也是Google视觉语言推荐的字体。

2017-09-19 14:55:27

Android 字体 修改
关于UCloud直播云所有技术细节都在这里(二)
国内常见公开的直播协议有几个:RTMP、HLS、HDL(HTTPFLV)、RTP,我们来逐一介绍。

2016-05-12 14:54:39

UCloud
关于UCloud直播云,所有的技术细节都在这里(一)
先来看看视频直播的5个关键的流程:录制编码网络传输解码播放,每个环节对于直播的延迟都会产生不同程度的影响。这里重点分析移动设备的情况。受限于技术的成熟度、硬件环境等,针对移动场景简单总结出直播延迟优化的4个点:网络、协议、编解码、移动终端,并一一解密UCloud直播云实现低延迟、秒开的技术细节。

2016-05-16 12:08:08

UCloud 直播云
关于UCloud直播云,所有的技术细节都在这里(二)
国内常见公开的直播协议有几个:RTMP、HLS、HDL(HTTPFLV)、RTP,我们来逐一介绍。

2016-05-16 14:00:39

UCloud 直播云
PostgreSQL 查询规划精髓,都在这里
成本是规划器的最佳估计。任何规划错误都会影响到成本与实际执行时间的相关性。成本评估的主要目的是,允许规划器在相同条件下比较同一查询的不同执行计划。

2024-07-08 10:18:26

“大数据杀熟”套路都在这里
同样的商品或服务,老客户看到的价格反而比新客户要贵出许多,这在互联网行业叫作“大数据杀熟”。调查发现,在机票、酒店、电影、电商、出行等多个价格有波动的平台都存在类似情况,且在在线旅游平台较为普遍,而国外一些网站早已有过类似情况。

2018-03-19 14:43:28

2018年AI趋势都在这里
很多公司采用数据挖掘,机器学习和人工智能的方法预测销售额,从而达到优化市场营销的目的。这些做法对公司的发展有很大的帮助,不同类型的人工智能结合在一起,深刻地改变着我们日常生活的方方面面。未来,我们还将看到更多的改变。本文为您带来2018年人工智能的8大趋势看点。

2017-10-24 14:57:58

AI 人工智能 机器学习
所有你想知道DevOps实践都在这里
随着互联网产业的飞速发展,IT研发的工作方式也越发的灵活多变。从应用的角度来说,由原来的单服务应用,到现在的微服务应用,处理的数据量和类型也在不断增长。

2019-11-04 09:07:48

DevOps 互联网 IT
我读 Typescript 源码秘诀都在这里
Textendsboolean这部分是一个ConditionType,有checkType、extendsType、trueType、falseType四个属性分别代表不同的部分。

2021-10-06 16:21:32

类型 对象 Typescript
时序分析中常用算法,都在这里
时序分析就是利用过去一段时间内某事件时间的特征来预测未来一段时间内该事件的特征。这是一类相对比较复杂的预测建模问题,和回归分析模型的预测不同,时间序列模型是依赖于事件发生的先后顺序的,同样大小的值改变顺序后输入模型产生的结果是不同的。

2023-12-11 21:59:01

时序分析 深度学习 自回归模型
6G:你想了解都在这里
虽然5G才刚刚起步,完整网络覆盖还需要几年时间,但是业界已经迫不及待探讨6G时代了,这将是5G之后的新一代网络技术,不过目前还处于畅想阶段,公认会在十年之后才有可能问世。

2019-12-04 07:57:22

6G 5G 网络
全面的tomcat优化参数总结,都在这里
最近准备对xx系统做一些优化工作,这里先从tomcat参数方面入手,后面再针对mysql和具体sql去做一下优化。

2019-07-21 08:10:21

技术 研发 优化
Linux 性能优化全景指南,可能都在这里
性能问题的本质就是系统资源已经到达瓶颈,但请求的处理还不够快,无法支撑更多的请求。性能分析实际上就是找出应用或系统的瓶颈,设法去避免或缓解它们。

2022-03-02 10:36:37

Linux 性能 优化
Linux从头学:所有编程语言中栈操作,底层原理都在这里
利用栈的后进先出特性,可以很方便的解决一些棘手的问题,以至于CPU单独分配了push和pop这两个命令来专门操作栈,当然了,还有其他一些辅助的栈操作指令。

2021-07-28 07:53:13

Linux 栈操作 Linux 系统
5G指南:你想知道都在这里
目前,全球运营商正在紧锣密鼓的进行5G商用部署,从结果来看,5G将带来与以往不同的改变,但大多数人对于5G还是带有一些疑问的,这些疑问主要来自于以下几个方面。

2018-11-28 10:39:01

5G 网络 运营商
完美支持Android Things开发板都在这里
这是AndroidThings专题的第二篇,我们介绍一下硬件。

2017-02-24 12:29:20

Android Thi 开发板 硬件
Linux从头学:所有编程语言中栈操作,底层原理都在这里
利用栈的后进先出特性,可以很方便的解决一些棘手的问题,以至于CPU单独分配了push和pop这两个命令来专门操作栈,当然了,还有其他一些辅助的栈操作指令。

2021-07-29 07:45:36

linux 编程 语言

玻璃钢生产厂家四川玻璃钢雕塑雕塑公司淮南卡通玻璃钢雕塑定做玻璃钢花盆哪儿郑州玻璃钢园林雕塑学校校园玻璃钢景观雕塑报价台湾商场新年美陈宁波仿铜玻璃钢雕塑安装商场美陈招标文件玻璃钢卡通牛雕塑厂家淮南景区玻璃钢雕塑多少钱山西佛像玻璃钢雕塑定制武汉动物玻璃钢雕塑安装珠海玻璃钢雕塑的特点林州玻璃钢雕塑制作池州定制玻璃钢雕塑价格上海主题商场美陈现价玻璃钢上海青雕塑玻璃钢迎宾造型雕塑北京玻璃钢卡通雕塑大量制作江苏通道商场美陈生产企业园林景观玻璃钢雕塑工厂浙江中庭商场美陈供货商浙江商场节庆美陈雕塑报价普洱市玻璃钢雕塑怎么样兰州生产玻璃钢雕塑厂家芝麻灰玻璃钢雕塑图片大全南充玻璃钢关公雕塑浙江开业商场美陈报价重庆仿铜玻璃钢雕塑定制西宁玻璃钢植物雕塑定做香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化