Hbase Region的切分与合并【原理分析】
一、Region的切分
Region的自动切分
Region自动切分是HBase能够拥有良好扩张性的最重要因素之一,当然他也是分布式系统追求扩展性很好的功能。当一个Region大到一定程度,会进行分裂(split),HBase可以通过Region Split达到负载均衡。
自动切分的触发策略
自动切分的触发策略有很多种,在1.2.6版本中应该有六种触发策略。但是我们经常用的最多三种。
- ConstantSizeRegionSplitPolicy:0.94版本前默认切分策略
- I ncreasingToUpperBoundRegionSplitPolicy : 0.94版本~2.0版本默认切分策略
- SteppingSplitPolicy: 2.0版本默认切分策略
ConstantSizeRegionSplitPolicy
这种切分策略的原理是当region的一个store的大小大于设置的阈值之后才会触发切分。这里实际实现store的大小为压缩后的文件大小。
ConstantSizeRegionSplitPolicy切分策略的弊端,没有对于大表和小表做明显的区分。阈值(hbase。hergion.max.filesize)设置较大对大表比较友好,但是设置较小则对小表比较友好。如果说对小表比较友好,就会出现大表在整个集群产生大量的region,这对于集群管理和资源使用显然不是一件好事。
I ncreasingToUpperBoundRegionSplitPolicy
在前面ConstantSizeRegionSplitPolicy的切分策略中,达到固定的阈值就会触发切分,但是在I ncreasingToUpperBoundRegionSplitPolicy中并不是这样,它的阈值并不是固定的,会在一定条件下进行调整,调整规则和regionserver上的region个数有关系:count(regions)^3 * flush size * 2.当然阈值不会一只增大,范围由用户设置的MaxRegionFileSize来确定。
这样的设计很好的弥补了ConstantSizeRegionSplitPolicy大小表切分不便的现象。
SteppingSplitPolicy: 2.0版本默认切分策略
这种切分就基本与I ncreasingToUpperBoundRegionSplitPolicy的切分方式差不多,但是切分阈值的规则不一样,它的规则是flush size * 2,否则为MaxRegionFileSize。
Region切分流程
Hbase将整个切分过程包装成了一个事务,意图能够保证切分事务的原子性。整个切分分为三个阶段
prepare – execute – (rollback)
prepare阶段:在内存中初始化两个子region,具体是生成两个HRegionInfo对象,包含tableName、regionName、startkey、endkey等。同时会生成一个transaction journal,这个对象用来记录切分的进展,具体见rollback阶段。
execute阶段:切分的核心操作。见下图(来自 Hortonworks ):
- regionserver 更改ZK节点 /region-in-transition 中该region的状态为SPLITING。
- master通过watch节点/region-in-transition检测到region状态改变,并修改内存中region的状态,在master页面RIT模块就可以看到region执行split的状态信息。
- 在父存储目录下新建临时文件夹.split保存split后的daughter region信息。
- 关闭parent region:parent region关闭数据写入并触发flush操作,将写入region的数据全部持久化到磁盘。此后短时间内客户端落在父region上的请求都会抛出异常NotServingRegionException。
- 核心分裂步骤:在.split文件夹下新建两个子文件夹,称之为daughter A、daughter B,并在文件夹中生成reference文件,分别指向父region中对应文件。这个步骤是所有步骤中最核心的一个环节,生成reference文件日志如下所示
- 父region分裂为两个子region后, 将daughter A、daughter B拷贝到HBase根目录下,形成两个新的region。
- parent region通知修改 hbase.meta 表后下线,不再提供服务。下线后parent region在meta表中的信息并不会马上删除,而是标注split列、offline列为true,并记录两个子region。为什么不立马删除?且听下文分解。
- 开启daughter A、daughter B两个子region。通知修改 hbase.meta 表,正式对外提供服务。
rollback阶段:如果execute阶段出现异常,则执行rollback操作。为了实现回滚,整个切分过程被分为很多子阶段,回滚程序会根据当前进展到哪个子阶段清理对应的垃圾数据。代码中使用 JournalEntryType 来表征各个子阶段。
二、Region预拆分
指定拆分算法
$ hbase org.apache.hadoop.hbase.util.RegionSplitter my_split_table HexStringSplit -c 10 -f mycf
其中:my_split_table:我们指定要新建的表名。
HexStringSplit:指定的拆分点算法为HexStringSplit。
-c:要拆分的Region数量。
-f:要建立的列族名称。
手动指定拆分点
#指定拆分点
create 'test_split2','mycf2',SPLITS=>['aaa','bbb','ccc','ddd','eee','fff']
#指定拆分文件
create 'students','baseinfo',SPLITS_FILE => '/home/hadoop/data/splits.txt'
三、Region的合并
合并的目的
如果删除了大量数据,很多Region变小,这时候分成多个Region就很浪费,可以把Region合并起来,Region的合并不是为了性能考虑,主要是出于维护的目的
合并分为两种
Minor一般由事件触发,Major一般由时间触发
相关控制
- Minor(1.2.0-cdh5.14.2版本)
- hbase.hregion.memstore.flush.size 缓存阈值大小
- hbase.hstore.compaction.max :每次compact的HFile的最大数目,默认是10
- hbase.hstore.compaction.kv.max:compact时批量读取和写入KeyValue数据的数量,默认是10
- Major Compaction
- hbase.hregion.majorcompaction 时间间隔
四、Flush和Compact操作
flush操作
flush 'tablename'
flush 'regionname'
compact操作
#compact一个表的所有regions
compact 't1'
#compact某个空闲的region
compact 'r1'
#compact一个region中的某个列族
compact 'r1', 'c1'
#compact一个表中的某个列族
compact 't1', 'c1'
六、Compaction - Control
Compaction总结
- 重写log文件并清除旧值
- 节约空间,提高读写速度
- 会占用大量系统空间和I/O,一般在系统空闲时进行
Flush -> Minor Compaction -> Major Compaction
- Flush:将memstore写到一个新的存储文件中
- Minor一般由事件触发,Major一般由时间触发
相关控制
- Flush: hbase.hregion.memstore.flush.size 文件大小
- Minor: hbase.hstore.compaction.min/max 文件数
- Major: hbase.hregion.majorcompaction 时间间隔
Hbase Region的切分与合并【原理分析】相关推荐
- HBase--分布式非关系型数据库HBase入门精讲(侧重原理)
分布式非关系型数据库HBase快速入门 一.HBase介绍 1. HBase 数据模型 2.HBase的物理存储结构 3.HBase的基本架构 4.HBase的完整架构 二.Hbase的工作流程 1. ...
- HBase region 定位原理
在Hbase中,大部分的操作都是在RegionServer完成的,Client进行插入,删除,查询数据都需要先找到相应的RegionServer.什么叫相应的RegionServer?就是管理你要操作 ...
- HBase Region原理总结归纳
HBase Region原理总结 1. 环境准备 基于Hadoop 3.2.1 基于zookeeper 3.4.6 基于Hbase 2.2.5 资料来源: 官网http://hbase.apache. ...
- FastDFS合并存储原理分析
FastDFS合并存储原理分析 基于FastDFS 5.03/5.04 2014-12-03 一.合并存储简介 在处理海量小文件问题上,文件系统处理性能会受到显著的影响,在读写次数与吞吐量这两个指标上 ...
- HBase系列--HBase Region合并
1.为什么要合并region 这个需要从Region的Split来说.当一个Region被不断的写数据,达到Region的Split的阀值时(由属性hbase.hregion.max.filesize ...
- 为什么MyISAM会比Innodb的查询速度快。 btree 和 lsm(hbase) ,cola 树(tokuDB)选型和原理
父文章 如何成为一名架构师,架构师成长之路_个人渣记录仅为自己搜索用的博客-CSDN博客_架构师成长之路 相关文章 1.8 leveldb vs rocksdb 优劣分析 对 write stalli ...
- HBase Region 简介和建议数量大小
Region是HBase数据管理的基本单位,region有一点像关系型数据的分区. region中存储这用户的真实数据,而为了管理这些数据,HBase使用了RegionSever来管理region. ...
- Redis数据持久化机制AOF原理分析一---转
http://blog.csdn.net/acceptedxukai/article/details/18136903 http://blog.csdn.net/acceptedxukai/artic ...
- Elasticsearch实现原理分析
介绍 本文是分析Elasticsearch系列文章中的一篇,是一个译文.共有三个部分,每部分讲解部分Elasticsearch的实现原理. 在翻译的过程中,也需要查看对应部分的源码,来加深对实 ...
最新文章
- Ajax---使用json数据格式输出数据
- 浅析Asp.net MVC 中Ajax的使用
- 生物智能与AI——关乎创造、关乎理解(下)
- python操作Excel文件
- 35款安卓App被通报窃取个人隐私!快看看你的手机里有没有
- 【报告分享】90后人群消费趋势研究报告.pdf
- python用字典统计单词出现次数_python - 如何使用字典理解来计算文档中每个单词的出现次数...
- winform生成exe俩秒钟就退出_Python有多牛逼?三万多条数据,几秒钟全部搞定~
- android测试中如何控制wifi
- 如何修改远程桌面连接端口 ,历史记录,支持多用户
- REDIS04_主从复制概述及搭建、反客为主、薪火相传、原理、哨兵模式、集群搭建
- windows7改linux密码忘记了,Windows 7和Linux忘记了启动密码怎么办?-win7忘记开机密码...
- eNSP实验记录(一):路由器与交换机
- TypeScript——理解 infer 关键字!
- html5游戏开发上升空间,风口上的HTML5,有前途,更有“钱”途!
- C++ Primer Plus 第六版第二章编程练习答案
- 创建桌面快捷方式及锁定到任务栏
- 丹佛斯变频器al13故障_丹佛斯变频器常见故障维修
- 网上商城小程序(小程序+PHP)
- UVa Problem 10205 Stack ’em Up (完美洗牌术)