关于HBase0.94版本在split region后META Scanner和CatalogJanitor并发操作时存在的问题

我们大家都知道,Hbase Region在达到一定大小的时会自动split为两个daughter region,在创建daughters时,会更改META表父region记录对应的regioninfo信息(在info family中增加offline列=true,splitA=DaughterA,splitB=DaughterB),并且在META表为daughters中增加两行记录。此时daughters region的hdfs storeFile并不存在,而是只包含对parent region 的引用,只有在做major compact时,才真正为两个daughter创建storeFile。

参见这个方法

MetaEditor. offlineParentInMeta(CatalogTrackercatalogTracker, HRegionInfo parent, final HRegionInfo a, final HRegionInfo b)

关于HBase0.94版本在split region后META Scanner和CatalogJanitor并发操作时存在的问题_第1张图片


Master有个后台线程catalog chore 会定时扫描META表,在fullscan过程中,发现有的parent region已经可以clean(daughter region已经不再引用parent region了),那么就调用

CatalogJanitor.cleanParent(final HRegionInfo parent,Result rowContent)做清理工作。

在清理的过程中,先clean parent中的两个column splitA和splitB(delete daughter reference),后清理parent中HDFS中的region storeFile和META表中对应parent的当前row(delete parent META entry),其实第一步是多余的,只需要第二部即可,为什么需要这么做,参见下面的分析:

假如在清理的过程中,同时有一个META Scanner的scan 到parent region 中,此时发现parent region split(info:split=true)了,但是在转向读取daughter region前,CatalogJanitor已经把parent和daughter之间的引用关系(parent region row中的info:splitA和info:splitB)给删除了,所以就会出现并发问题,

JIRA中HBASE-8505的对这个也有描述

References to split daughters should not be deleted separately from parent META entry



你可能感兴趣的:(并发,hbase,split,HBASE-8505)