HBase RegionServer分裂的实现

所有的写请求都是在RegionServer中进行,数据在memstore累积后一次性写入到Storefile磁盘中,这个过程称为memstore flush。数据量不断地增长,storefile文件不断增大。RegionServer会根据分表策略决定是否开始执行分表。

从逻辑上而言,Region的分裂过程是极为简单的,我们只有确定将Region分为两部分的分裂点,然后将一个Region拆分为两个新的Region即可。而实际上执行过程要相对复杂的多。当分裂开始时,新创建的两个子Region并不会写入数据,而是创建一个称为Reference files的链接文件分别指向原来Region Storefile的前半部分和后半部分。当原Region数据文件不再被访问时,Region开始进行分裂。Reference files会随着分裂而逐渐被清除,最终Region不再引用原Region,分裂逐渐完成,原Region被清除。

Region分裂虽然由RegionServer本身做出的决定,但是在分裂过程中会牵扯到其他部分的协作,分裂之前和之后RegionServer会通知Master;为了客户端可以找到新的Region更新.META.表;重新排列HDFS上的文件结构。分裂是一个多线程、多任务的操作,为了在错误发生时可以回滚,RegionServer会将执行的状态保存在内存之中。

下面是RegionServer分裂的过程,RegionServer和Master操作标识\color{red}{红色},客户端操作为\color{green}{绿色}

RegionServer Split Process--摘自HBase Reference Guide

利用ZooKeeper通信,通知Master。

  1. RegionServer做出决定,Region的分裂开始。RegionServer会申请HBase表上的一个读锁,防止在分裂的过程中,HBase表的schema发生改变。在zookeeper的目录/hbase/region-in-transition/region-name下创建一个新的znode节点,并且设置为SPLITTING;

  2. Master监听/hbase/region-in-transition/region-name目录下的znode节点,会同时感知到新的znode节点的创建;

父region关闭,进行分裂。

  1. RegionServer在HDFS的父Region文件夹下创建一个名为.splits的子文件夹;

  2. RegionServer在本地的数据结构中会关闭父Region,刷入cache中数据,并且使region处于下线状态。此时,如果客户端请求到关闭的父Region,会弹出NotServingRegionException的异常。客户端进行一些补偿性重试;

  3. RegionServer在文件夹.splits下创建Region文件夹(子Region A和子Region B)和必要的数据结构。然后开始对store files进行分裂,对每一个父Region的store file文件创建两个Reference files,这些reference files指向父Region的文件;

  4. RegionServer在HDFS上创建实际的Region文件夹,然后将reference files分别移到两个子Region文件夹下;

更新.META.表。

  1. RegionServer发送Put请求给.META.表,修改父Region为下线状态并且增加两个子Region的信息。这时,在.META.表中仍旧没有访问入口。客户端如果扫描.META.表,将会看到父Region正在分裂,不会看到子Region。如果Put请求执行成功,父Region将会高效的被分裂,否则Master和下次打开Region的RegionServer会清除这些脏数据;

分裂之后,打开新region,.META.表更新可访问新region,通知Master完成。

  1. RegionServer并发打开子Region A和子Region B;

  2. RegionServer增加子Region A 和子Region B的信息。具有父Region引用的子Region现在处于在线状态,客户端可以发现新的Region并且向它们发送请求。客户端会在本地缓存全部的.META.表信息,向新的Region发送请求时,本地的缓存无效,从.META.获取最新的Region信息;

  3. RegionServer更新znode节点/hbase/region-in-transition/region-name的状态为SPLIT,这样Master可以及时了解到分裂的情况。负载均衡器如果需要可以自由地分配子Region到其他RegionServer中。现在,分裂操作完成。

最后清除无效的数据。

  1. 在分裂完成后,.META.和HDFS仍旧存在着指向父Region的引用。随着子Region数据的重写,这些引用会逐渐清除。Master中的垃圾回收器任务会定期检查子Region是否仍然具有父Region的引用。如果父Region不存在引用,则将会被清除。

上面是完整的RegionServer分裂的实现。在大数据存储过程中常常会遇到分表的情况产生,也是面试过程中大数据方面,面试官常常爱问的问题,“当数据量过大时,如果进行分库分表呢?”。HBase的分表操作或许会给我们一些启示。

参考文献:Apache HBase Region Splitting and Merging

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,233评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,013评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,030评论 0 241
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,827评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,221评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,542评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,814评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,513评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,225评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,497评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,998评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,342评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,986评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,812评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,560评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,461评论 2 266

推荐阅读更多精彩内容