一、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的切分与合并【原理分析】相关推荐

  1. HBase--分布式非关系型数据库HBase入门精讲(侧重原理)

    分布式非关系型数据库HBase快速入门 一.HBase介绍 1. HBase 数据模型 2.HBase的物理存储结构 3.HBase的基本架构 4.HBase的完整架构 二.Hbase的工作流程 1. ...

  2. HBase region 定位原理

    在Hbase中,大部分的操作都是在RegionServer完成的,Client进行插入,删除,查询数据都需要先找到相应的RegionServer.什么叫相应的RegionServer?就是管理你要操作 ...

  3. HBase Region原理总结归纳

    HBase Region原理总结 1. 环境准备 基于Hadoop 3.2.1 基于zookeeper 3.4.6 基于Hbase 2.2.5 资料来源: 官网http://hbase.apache. ...

  4. FastDFS合并存储原理分析

    FastDFS合并存储原理分析 基于FastDFS 5.03/5.04 2014-12-03 一.合并存储简介 在处理海量小文件问题上,文件系统处理性能会受到显著的影响,在读写次数与吞吐量这两个指标上 ...

  5. HBase系列--HBase Region合并

    1.为什么要合并region 这个需要从Region的Split来说.当一个Region被不断的写数据,达到Region的Split的阀值时(由属性hbase.hregion.max.filesize ...

  6. 为什么MyISAM会比Innodb的查询速度快。 btree 和 lsm(hbase) ,cola 树(tokuDB)选型和原理

    父文章 如何成为一名架构师,架构师成长之路_个人渣记录仅为自己搜索用的博客-CSDN博客_架构师成长之路 相关文章 1.8 leveldb vs rocksdb 优劣分析 对 write stalli ...

  7. HBase Region 简介和建议数量大小

    Region是HBase数据管理的基本单位,region有一点像关系型数据的分区. region中存储这用户的真实数据,而为了管理这些数据,HBase使用了RegionSever来管理region. ...

  8. Redis数据持久化机制AOF原理分析一---转

    http://blog.csdn.net/acceptedxukai/article/details/18136903 http://blog.csdn.net/acceptedxukai/artic ...

  9. Elasticsearch实现原理分析

    介绍 本文是分析Elasticsearch系列文章中的一篇,是一个译文.共有三个部分,每部分讲解部分Elasticsearch的实现原理.     在翻译的过程中,也需要查看对应部分的源码,来加深对实 ...

最新文章

  1. Ajax---使用json数据格式输出数据
  2. 浅析Asp.net MVC 中Ajax的使用
  3. 生物智能与AI——关乎创造、关乎理解(下)
  4. python操作Excel文件
  5. 35款安卓App被通报窃取个人隐私!快看看你的手机里有没有
  6. 【报告分享】90后人群消费趋势研究报告.pdf
  7. python用字典统计单词出现次数_python - 如何使用字典理解来计算文档中每个单词的出现次数...
  8. winform生成exe俩秒钟就退出_Python有多牛逼?三万多条数据,几秒钟全部搞定~
  9. android测试中如何控制wifi
  10. 如何修改远程桌面连接端口 ,历史记录,支持多用户
  11. REDIS04_主从复制概述及搭建、反客为主、薪火相传、原理、哨兵模式、集群搭建
  12. windows7改linux密码忘记了,Windows 7和Linux忘记了启动密码怎么办?-win7忘记开机密码...
  13. eNSP实验记录(一):路由器与交换机
  14. TypeScript——理解 infer 关键字!
  15. html5游戏开发上升空间,风口上的HTML5,有前途,更有“钱”途!
  16. C++ Primer Plus 第六版第二章编程练习答案
  17. 创建桌面快捷方式及锁定到任务栏
  18. 丹佛斯变频器al13故障_丹佛斯变频器常见故障维修
  19. 网上商城小程序(小程序+PHP)
  20. UVa Problem 10205 Stack ’em Up (完美洗牌术)

热门文章

  1. java基础知识和JDBC
  2. ubuntu安装ActiveMQ
  3. [运算放大器]佛朗哥笔记 - 电阻性反馈电路 - 电流泵与电流放大器
  4. SVG公众号排版 | 快速解决视频号美化出现“点赞信息”
  5. 通过python各种开源库,开发一个适合大部分公司测试项目框架,确定名字AutoTestProjects
  6. 应付一天(今天太累)附新东方考研5500词音频
  7. 求过圆心直线与圆的两个交点
  8. 视频怎么变成gif?快速巧妙生成动图的方法介绍
  9. 电脑突然复制粘贴不了
  10. Julia 数据科学应用