Region Split操作主要分为2个动作:
(1)当splitkey==null时,计算此次拆分的splitkey
(2)根据splitkey进行实际的拆分工作
如何获取splitkey?
1、调用checkSplit函数,若发现被拆分的region是meta region,这直接返回,因为meta Region不能被拆分
2、判断是否满足拆分策略:(1)store大于限定值;(2)人为调用api强制split
3、找出待拆分的region中最大的Store并且从这个最大的Store中找到拆分点,具体实现如下
3.1、获取store级别的读锁
3.2、查找拆分点
3.2.1、获取store中最大的storeFile
3.2.2、获取storeFile的拆分点,其实就是storefile的midkey
3.3、释放store级别的读锁
获取到splitkey后,如何拆分?
1、首先调用如下函数,生成并启动SplitRequest线程
2、SplitRequest线程中的run函数主要执行doSplitting函数,split的主体操作全在该函数内部执行
3、接下来重点看doSplitting函数的具体实现
3.1、首先获取table级别的共享读锁
3.2、构造并执行SplitTransactionImpl
3.2.1、createDaughters函数
3.2.1.1、首先获得parent Region的写锁
3.2.1.2、执行stepsBeforePONR生成2个daughterRegions
3.2.1.2.1、首先在ZK中建立Region_Split节点 (SplitTransactionPhase.SET_SPLITTING)
3.2.1.2.2、在parentHDFS目录中创建./splits目录 (SplitTransactionPhase.CREATE_SPLIT_DIR)
3.2.1.2.3、将所有的storeFiles关闭 (SplitTransactionPhase.CLOSED_PARENT_REGION)
3.2.1.2.4、将parentRegion从RegionServer的OnlineRegions列表中删除 (SplitTransactionPhase.OFFLINED_PARENT)
3.2.1.2.5、生成referenceFiles
生成referenceFile具体实现:
接着往下跟:
接着往下跟:
(1)判断storeFile中是否包含splitkey;
(2)生成CF对应的Dirs
(3)生成对应的referenceFile,根据starkey或者endkey和splitkey生成referenceFile指向parent对应的storeFiles,Compaction的时候会处理;
3.2.1.2.6、将.splits目录下的region_A和region_B生成正式的2个Region
3.2.1.3、将parentRegion从Meta表中offline,并且将2个Daughters Region信息插入到meta表
3.2.2、stepsAfterPONR函数,该函数实现Daughters Region的Open以及将Region_A和Region_B添加到RegionServer的OnlineRegions中,最后将Region_A和Region_B注册到ZNode中
3.3、释放table级别的共享读锁
