RegionServer Splitting 实现

HBase 中的写请求由 Region Server 处理,这些数据首先存储在 memstore (RegionServer 里的一个存储系统)里。一旦 memstore 满了后,它的内容会被写到磁盘,在磁盘上以文件的形式存储(HFile),这个事件被称为一个 memstore flush。随着这些文件的增加,RegionServer 会将它们compact为一些数量更少,但是内容更大的文件。在每次 flush 或 compaction 完成后,region里存储的数据量会变化。RegionServer 会参考 region split policy,并判断:

  1. region 是否是增长到了足够大的规模
  2. 此region由于某些特定policy的原因,需要进行split

如果符合split policy,则一个region split request 会被放入到请求队列中。

从逻辑上来说,region split的过程较为简单。我们会在region的keyspace中找到一个合适的点,将region分为两半,然后将此region的数据以那个点为依据,分配到两个新region中。然而,整个过程其实并不简单。当一个split发生时,新创建的 daughter regions不会立即将所有数据重写到新文件里。而是创建类似于 symbolic link 的小文件,名为 Reference files。References files 会根据 parent store file 的 split point,分别指向这个文件的两部分。第一部分为“bottom”,也就是从文件头,到分离点。第二部分为“top”,也就是分离点到文件末尾。Reference file使用起来基本就像一个正常的数据文件,但是仅仅会考虑其中一半的记录。一个region可以被split 的必要条件是:没有references 指向父region 的 immutable 数据文件。那些 reference files 会被compactions的机制逐渐地被清理掉,这样region就停止指向它的父文件,也就可以被进一步的split。

尽管splitting region是一个本地决策,由RegionServer 决定,但是split的过程必须要与其他很多因素协作完成。RegionServer在split前后,均会通知Master更新.META. 表,这样客户端可以找到新的子regions。在HDFS上的数据文件以及目录结构也会被rearranged。Splitting是一个多任务的过程。为了实现在遇到错误时回滚操作,RegionServer在内存里存了一个记录 execution state 的日志。RegionServer执行split 时的步骤如下图所示。每个步骤标有它的步骤号。RegionServers 或 Master 的操作标为红色,客户端的操作标为绿色:

  1. RegionServer 本地决定做 split region,并开始着手准备。THE SPLIT TRANSACTION IS STARTED。首先第一步,RegionServer 获取一个 shared read lock on table,以防表的 schema 在splitting 过程中被修改。然后它创建一个 znode,在zookeeper 下的 /hbase/region-in-transition/region-name,并设置此znode的状态为SPLITTING
  2. Master感知到此znode,因为它有一个watcher监控region-in-transition的父znode
  3. RegionServer 创建一个子目录,名为.splits,在HDFS的父region目录下
  4. RegionServer close 父region,并在它本地的数据结构里将此region标注为 offline。THE SPLITTING REGION IS NOW OFFLINE。在此时,客户端的请求到父region时,会抛出 NotServingRegionException。客户端会以一些回退方法进行重试。正在closing的region会被flushed
  5. RegionServer在.splits 文件夹下,为两个子regions A 和 B 创建region文件夹,并且创建必要的数据结构。然后RegionServer开始对存储文件做分割,也就是说,它为父region的每个存储文件创建两个 Reference 文件。这些 reference 文件将指向父region的存储文件
  6. RegionServer在HDFS创建真正的子region文件夹,并且将references 文件移动到对应的子region目录
  7. RegionServer 发送一个 Put 请求到 .META. 表,将父region在.META.表里设置为offline,并且增加子region的信息。在这时候,.META. 表中不会有单独的子region的条目。客户端在 scan .META. 表时会看到父region在split,但是不会获取到子region的信息,直到它们在.META. 表中出现。同时,如果这个到 .META. 表的 Put 请求成功,则父region会实际上开始做split。如果在这个 RPC 成功前,RegionServer fail 掉了,则Master和下一个open这个父region的 RegionServer 会清理掉region split 的dirty state(脏状态)。在.META. 更新后,region split的信息会被Master做前滚(rolled-forward)
  8. RegionServer 同时 open 子region A 和 B
  9. RegionServer 将子Region A 和 B ,以及它们 host 的region信息一起添加到 .META. 表。THE SPLIT REGIONS(DAUGHTERS WITH REFERENCES TO PARENT)ARE NOW ONLINE。在此之后,客户端可以看到这些新region,并且向它们发送请求。客户端会缓存.META.条目在本地,但是当它们向RegionServer或.META.表发送请求时,他们的缓存会失效,并且需要从.META.表里获取新Region的信息
  10. RegionServer 更新ZooKeeper 里的znode /hbase/region-in-transition/region-name 的状态到 SPLIT,这样master可以感知到此。如有必要,balancer 也可以放心的将子region重新分配到其他RegionServer上。THE SPLIT TRANSACTION IS NOW FINISHED
  11. 在split过后,.META. 以及 HDFS会仍然保留指向父region的references。在子region做compactions时,会重写数据文件,这些references文件会被清除掉。Master上的垃圾回收任务会定期检查子regions是否仍然指向父region的文件。如果没有,则父region会被清除掉。

References:

http://hbase.apache.org/book.html#upgrade2.0.regions.on.master

HBase RegionServer Splitting 流程的更多相关文章

  1. HBase 数据读写流程

    HBase 数据读写流程 2016-10-18 杜亦舒 读数据 HBase的表是按行拆分为一个个 region 块儿,这些块儿被放置在各个 regionserver 中 假设现在想在用户表中获取 ro ...

  2. HBase数据存取流程

    一.HBase的特点是什么 1.HBase一个分布式的基于列式存储或者行式存储的数据库,基于hadoop的hdfs存储,zookeeper进行管理. 2.HBase适合存储半结构化或非结构化数据,对于 ...

  3. HBase - 数据写入流程解析

    本文由  网易云发布. 作者:范欣欣 本篇文章仅限内部分享,如需转载,请联系网易获取授权. 众所周知,HBase默认适用于写多读少的应用,正是依赖于它相当出色的写入性能:一个100台RS的集群可以轻松 ...

  4. HBase数据读写流程(1.3.1)

    ===数据写入流程=== 源码:https://github.com/apache/hbase/blob/master/hbase-server/src/main/java/org/apache/ha ...

  5. 20130617 hbase regionserver 老挂掉

    hbase regionserver 老挂掉: 添加如下: <property><name>hbase.regionserver.restart.on.zk.expire< ...

  6. hbase regionserver IO问题

    regionserver日志: java.io.IOException: Connection reset by peer         at sun.nio.ch.FileDispatcherIm ...

  7. 【解决】hbase regionserver意外关机启动失败 [main] mortbay.log: tmpdir java.io.IOException: Permission denied

    错误信息: 015-12-24 10:57:26,527 INFO  [main] mortbay.log: jetty-6.1.26.cloudera.4 2015-12-24 10:57:26,5 ...

  8. 【原创】大叔问题定位分享(1)HBase RegionServer频繁挂掉

    最近hbase集群很多region server挂掉,查看其中一个RegionServer1日志发现,17:17:14挂的时候服务器压力很大,有大量的responseTooSlow,也有不少gc,但是 ...

  9. zookeeper的maxSessionTimeout默认值导致hbase regionserver超时

    zookeeper的maxSessionTimeout默认值导致hbase regionserver超时 在hbase中经常会遇到regionserver挂掉的情况,查看日志会看到这样的错误信息 20 ...

随机推荐

  1. Linux系统——MHA-Atlas-MySQL高可用集群

    Linux系统——MHA-Atlas-MySQL高可用集群 MHA MHA介绍MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,是一套优秀的 ...

  2. 【Python学习】iterator 迭代器小练习

    http://anandology.com/python-practice-book/iterators.html  Problem 1: Write an iterator class revers ...

  3. log4net 写入 mongodb+Mongodb记录日志

    项目里面需要记录大量的日志,为了方便分析,也是为了方便开发人员远程查询日志,可以把日志写入MongoDB. 1.先上Log4net配置 <?xml version="1.0" ...

  4. python精进之路 -- open函数

    下面是python中builtins文件里对open函数的定义,我将英文按照我的理解翻译成中文,方便以后查看. def open(file, mode='r', buffering=None, enc ...

  5. Java输出流FileOutputStream使用详解

    Java输出流FileOutputStream使用详解 http://baijiahao.baidu.com/s?id=1600984799323133994&wfr=spider&f ...

  6. px和em的区别, css权重

    PX特点:px像素(Pixel).相对长度单位.像素px是相对于显示器屏幕分辨率而言的. EM特点 1. em的值并不是固定的:2. em会继承父级元素的字体大小. 优先级:!important> ...

  7. caffe常用

    1. 关闭模型froward信息 os.environ[' #注意要在improt caffe之前 2. 学习率 step: 配合stepsize,迭代次数达到stepsize的整数倍改变一次, ba ...

  8. Node.js基础学习三之登录功能

    本篇介绍Node.js访问数据库并返回数据给客户端 需求基于Node.js学习(二) 数据库请下载:user.sql 1.创建user 实体类(model-user.js) function User ...

  9. WebService的调用

    今天测试用代码如何去调用WebService,因为之前都是直接vs直接引用,网上搜索的很多也并没有讲清楚,搞得一直不得劲.其实基元对象(string/int等)的调用倒是挺简单的,根据方法名赋值传参就 ...

  10. bzoj 4767 两双手 - 动态规划 - 容斥原理

    题目传送门 传送门I 传送门II 题目大意 一个无限大的棋盘上有一只马,设马在某个时刻的位置为$(x, y)$, 每次移动可以将马移动到$(x + A_x, y + A_y)$或者$(x + B_x, ...