HBase拥有出色的扩展性,其中最依赖的就是region的自动split机制。

1.split触发时机与策略

前面我们已经知道了,数据写入过程中,需要先写memstore,然后memstore满了以后,flush写入磁盘,形成新的HFile文件。

当HFile文件数量不断累积,Region server就会触发compaction机制,把小文件合并为大的HFIle。

当每次flush完成 或者 compaction完成后,regionSplitPolicy就会判断是否需要进行split。

split触发时机简单来说,就是看一个region里面的最大store是否超过阈值。

当然,hbase支持多种策略来设置这个阈值到底怎么计算,这就是触发策略。

  • 0.94版本前默认的策略是ConstantSizeRegionSplitPolicy,这个阈值时一个固定值。
  • 0.94-2.0版本的默认策略是IncreasingToUpperBoundRegionSplitPolicy。
  • 2.0版本的默认策略是SteppingSplitPolicy。这两种策略设置的阈值不是一个固定值,而是会和region所属表在当前regionserver上的region个数有关。只是在计算公式上稍有差异。

另外,还有比如DisableSplitPolicy、KeyPrefixRegionSplitPolicy,DelimitedKeyPrefixRegionSplitPolicy等策略,就不一一介绍了。

2.split流程

一旦开始region split,那么就会创建两个daughter region。

这时候不会立刻将所有数据写到新的region里面去,而是创建引用文件,叫做Reference files,指向parent region。

reference文件作为一个数据规则文件,在split期间,新的查询会根据这个文件去父region的HStore上查询数据。当经过一次major compaction后,数据迁移到新的region中,reference文件会被删除,表示spilit真正完成。

具体过程如下:

1)regionserver在zookeeper中创建一个新的znode在/hbase/region-in-transition/region-name目录下,状态为SPLITTING

2)master通过watch zk上的region-in-transition目录,得知这个region处于split状态

3)region server在HDFS的parent region目录下创建一个子目录叫做“.splits”

4)region server关闭parent region,强制flush这个region下的cache数据,并且标记这个region为下线状态。这个时候,如果有客户端请求落在这个region上,就会抛出NotServingRegionException。

5)Region server创建新的region在.spllits目录下,我们标记为daughter region A和daughter region B,同时创建必要的数据结构。然后就会创建两个Reference文件,指向parent region的那些存储文件。

6)Region Server在HDFS中创建实际的region目录,并将daughterA和daughter B移动到HBase根目录下,形成两个新的region。

7)Region server会发送put请求给.mete. table,然后把parent region设置为offline的状态,并且给新的region添加信息。

8)region server 打开新的region接受读写请求

9)region server将region A和B的信息添加到.meta.表,可以真正对外提供服务了。

扫尾工作:

1)客户端请求.meta.表,发现新的region信息,就会把本地缓存重新设置

2)region server更新zk上/hbase/region-in-transition/region-name目录下的znode状态,改为SPLIT,然后master通过watch得知这个信息。如果有必要,负载均衡器可以选择将新的region分布到新的region server上。

3)完成split工作后,meta和HDFS还是会保留reference文件到parent region。等到下次compaction时,会完成数据到新region的迁移,然后才会删除reference文件。

3.pre-splitting

当一张表被首次创建时,只会分配一个region给这个表。因此,在刚刚开始时,所有读写请求都会落在这个region所在的region server上,而不管你整个集群有多少个region server。不能充分地利用集群的分布式特性。

主要原因跟split的机制有关,一开始的时候,系统无法判断你到底需要用哪个rowkey进行split。

因此,hbase提供了工具让你能自己解决这个问题,叫做pre-splitting。

你可以在创建表的时候,指定哪些split point将region分成几份。如果切分的好,那么自然就可以一开始就充分利用分布式的特性。但是需要注意,如果切分的不好,存在热点region,那么反而会影响读写性能。

这里也没有一个特别好的原则来说到底pre split多少个region最合适,不过最好的方式,还是以region server数量的倍数(较小的倍数)来创建pre split的region数量,然后让集群本身去做自动的spliting。

4.split的事务性保证

2.0版本后,HBase会使用HLog存储单机事务(DDL\Split\Move等)的中间状态,保证了即使事务过程中出现异常,也能安全地回滚或继续提交。

看到这里了,原创不易,点个关注、点个赞吧,你最好看了~

知识碎片重新梳理,构建Java知识图谱:https://github.com/saigu/JavaKnowledgeGraph(历史文章查阅非常方便)

扫码关注我的公众号“阿丸笔记”,第一时间获取最新更新。同时可以免费获取海量Java技术栈电子书、各个大厂面试题。

「从零单排HBase 05」核心特性region split的更多相关文章

  1. 「从零单排HBase 06」你必须知道的HBase最佳实践

    前面,我们已经打下了很多关于HBase的理论基础,今天,我们主要聊聊在实际开发使用HBase中,需要关注的一些最佳实践经验. 1.Schema设计七大原则 1)每个region的大小应该控制在10G到 ...

  2. 「从零单排HBase 04」HBase高性能查询揭秘

    先给结论吧:HBase利用compaction机制,通过大量的读延迟毛刺和一定的写阻塞,来换取整体上的读取延迟的平稳. 1.为什么要compaction 在上一篇 HBase读写 中我们提到了,HBa ...

  3. 「从零单排HBase 12」HBase二级索引Phoenix使用与最佳实践

    Phoenix是构建在HBase上的一个SQL层,能让我们用标准的JDBC APIs对HBase数据进行增删改查,构建二级索引.当然,开源产品嘛,自然需要注意“避坑”啦,阿丸会把使用方式和最佳实践都告 ...

  4. 「从零单排canal 05」 server模块源码解析

    基于1.1.5-alpha版本,具体源码笔记可以参考我的github:https://github.com/saigu/JavaKnowledgeGraph/tree/master/code_read ...

  5. 「从零单排HBase 09」Hbase的那些数据结构和算法

    在之前学习MySQL的时候,我们知道存储引擎常用的索引结构有B+树索引和哈希索引. 而对HBase的学习,也离不开索引结构的学习,它使用了一种LSM树((Log-Structured Merge-Tr ...

  6. 「从零单排HBase 10」HBase集群多租户实践

    在HBase1.1.0发布之前,HBase同一集群上的用户.表都是平等的,大家平等共用集群资源.容易碰到两个问题: 一是某些业务较其他业务重要,需要在资源有限的情况下优先保证核心重要业务的正常运行 二 ...

  7. 「从零单排canal 04」 启动模块deployer源码解析

    基于1.1.5-alpha版本,具体源码笔记可以参考我的github:https://github.com/saigu/JavaKnowledgeGraph/tree/master/code_read ...

  8. 「从零单排canal 06」 instance模块源码解析

    基于1.1.5-alpha版本,具体源码笔记可以参考我的github:https://github.com/saigu/JavaKnowledgeGraph/tree/master/code_read ...

  9. 「从零单排canal 07」 parser模块源码解析

    基于1.1.5-alpha版本,具体源码笔记可以参考我的github:https://github.com/saigu/JavaKnowledgeGraph/tree/master/code_read ...

随机推荐

  1. 零基础学习Web前端开发

    目录 技术背景 开发环境 学习过程 参考资料 结束语 技术背景 什么是前端开发? 前端开发是创建Web页面或App等将界面呈现给用户的过程.通过使用 HTML,CSS,JavaScript,以及它们衍 ...

  2. jsonp和callback的使用

    这两天用 Jquery 跨域取数据的时候,经常碰到 invalid label 这个错误,十分的郁闷,老是取不到服务器端发送回来的 json 值, 一般跨域用到的两个方法为:$.ajax 和$.get ...

  3. Xpath 入门教程

    准备xml 文档 <?xml version="1.0" encoding="UTF-8"?> <bookstore> <book ...

  4. MSSS攝影大賽計劃書(第三版)

    比賽內容:對香港的城市風景以及自然風光的攝影 預期成果: 提升同學對香港的認識,鼓勵學生走出大學學園去瞭解香港,同時豐富會員的課餘活動,培養同學的興趣愛好 比賽時間:4月1-15日 最後作品提交時間: ...

  5. [LC] 28. Implement strStr()

    Implement strStr(). Return the index of the first occurrence of needle in haystack, or -1 if needle ...

  6. leetcode第30题:括号生成

    这是目前遇到最难的题,刚开始的思路是:匹配words中元素是否在s中,若在找所在元素的后words长度位的字符串,判断words其他元素是否都在s中. 看似这个思路可行,实际上存在的问题: 1.wor ...

  7. 喜欢B站的用户为何认同感超强?

    前几天视频弹幕网站哔哩哔哩(以下简称"B站"),正式登陆纳斯达克,股票代码"BILI".当日其CEOC兼董事长陈睿在B站的账号上传了上市视频. 打开视频,满眼& ...

  8. Service层在MVC框架中的意义和职责

    https://blog.csdn.net/u012562943/article/details/53462157 mvc框架由model,view,controller组成,执行流程一般是:在con ...

  9. <JZOJ5937&luogu3944>斩杀计划&肮脏的牧师

    第一次写桶排相关题.... #include<cstdio> #include<iostream> #define rint register int template < ...

  10. ZOJ 2532 网络流最小割

    求最小割的问题. 题意:已知网络中有n个源点,m的中转站(也就是节点),一个汇点(编号为0).给出网络,求一些边(增大这个边就可以增大汇点流量的边). 思路:一开始代码只找了有流=0就加入输出数组的情 ...