文章目录
  1. Hbase源码09_Split过程
    1. 1. 简介
    2. 2. 分析
      1. 2.1 Split准备
      2. 2.2 处理SplitRequest
    3. 3. 总结

[TOC]

Hbase源码09_Split过程

1. 简介

在上节 MemStore -> HFile 的flush完成之后, 会判断是否需要对HFile进行 Split 或者 Compact。下面对Split的过程做简单的分析。

注: Cannot split meta region in HBase 0.20 and above

2. 分析

2.1 Split准备

  • 调用 compactSplitThreadrequestSplit 方法
    compactSplitThread 是在HRegionServer启动初始化的时候创建的,所有相关线程的启动都在 HRegionServer#initializeThreads 方法中。
    内部有个 splits线程池,线程数由 hbase.regionserver.thread.split(默认1) 配置。
  • requestSplit 方法

midKey计算:

  1. 找到最大的Store
  2. 找到该Store中最大的HFile
  3. 根据 midLeafBlock索引信息 获取 Middle BlockStartKey, 即 midKey
  • 发起 SplitRequest 请求, 丢到 splits线程池处理

2.2 处理SplitRequest

转到 SplitRequest#run(), 执行 doSplitting 方法.

  • 创建 SplitTransactionImpl, 类似事务的概念. 执行 prepare 方法

  • 执行 execute 方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
1. 执行 PairOfSameType<Region> regions = createDaughters(server, services, user);
* >>>> 执行 preSplit 的协处理器
// ⭐️ 主要步骤
* 执行 PairOfSameType<Region> daughterRegions = stepsBeforePONR(server, services, testing);
* ====== 管理ZK节点, 开始执行splitting操作(创建PENDING_SPLIT, 等待master修改为SPLITTING)
* 创建 .split 目录, 后续split的文件都放在这个目录中
* 关闭当前的HRegion, 并下线, 不再提供服务
* ⭐️⭐️ 执行 splitStoreFiles 方法, 该方法正式切割HFile文件
* 为每个StoreFile创建StoreFileSplitter(Callable接口), 然后丢入到线程池中
* 执行StoreFileSplitter的call方法
* 执行splitStoreFile, 开始切割. 原理就是根据MidKey, 读取将文件切割放置到.split目录中, 分成两个子Region目录
* ⭐️⭐️ 执行 createDaughterRegionFromSplits, 转移子Region(a和b)的.split数据到真实目录中, 并创建子HRegion实例
* >>>> 执行 preSplitBeforePONR 的协处理器
* 执行 MetaTableAccessor.splitRegion, 创建 META, .regioninfo 等元数据信息
* >>>> 执行 preSplitAfterPONR 的协处理器
2. 执行 stepsAfterPONR 方法
* ⭐️⭐️ 执行 openDaughters 方法, 创建两个DaughterOpener线程, 打开Region进行服务
* 内部就执行initialize, 各种Store, HFile的初始化。
* ====== 管理ZK节点, 等待master置为RS_ZK_REGION_SPLIT, 表示split完成
* >>>> 执行 postSplit 的协处理器

注: 中间会执行各种 transition 方法, 其实就是可以自定义TransactionListener类, 相当于Hook一样。

  • 当抛出异常, 执行 rollback 方法
1
2
3
>>>> 执行 preRollBackSplit 协处理器
简单说下: 根据transition中记录的执行步骤, 开始进行回滚, 清除各种创建的文件和目录之类的。
>>>> 执行 postRollBackSplit 协处理器

3. 总结

到这基本就结束了, 中间还有判断是否需要Compact, 关于Compact, 下节在介绍。

其实大多时候打开自动Split的情况不错, 一般优化都是预定义好Region的数量。因为Split过程(Compact过程也一样)很费时间, 并且会影响到线上服务。

文章目录
  1. Hbase源码09_Split过程
    1. 1. 简介
    2. 2. 分析
      1. 2.1 Split准备
      2. 2.2 处理SplitRequest
    3. 3. 总结