合并的整体流程

合并任务管理器CompactionTaskManager

该类负责管理合并任务的运行,例如把合并任务加入到等待队列里,并定时从等待队列里拿取高优先级的线程进行执行。

 

  1. 重要属性
    1. candidateCompactionTaskQueue:合并线程的等待队列,可容纳的任务数量默认为1024个,若满了则会踢掉低优先级的线程
    2. 两个线程池
      1. taskExecutionPool:合并任务的执行线程池,系统预设的线程数量为10
      2. compactionTaskSubmissionThreadPool:定时执行线程池,该池里的线程负责定时从等待队列里拿取一个合并任务进行执行。系统预设的线程数量为1个。
    3. runningCompactionTaskList:正在执行合并的任务列表
    4. currentTaskNum:当前正在执行合并任务的线程数量
    5. Task_Submit_Interval:每个合并线程执行的时间间隔,系统预设值为1
  2. 合并任务的优先级

           candidateCompactionTaskQueue队列里,任务是根据自定义的优先级进行排序的,优先级高的任务会被优先执行。当该队列满时,若添加新的合并任务,则会把优先级最低的给踢掉。下面讲解合并任务的优先级定义规则,在CompactionTaskComparator类里:

    1. 若两个任务一个是空间内合并,另一个是跨空间合并,且系统预设的合并优先级不是balance
      1. 若系统预设的合并执行优先级是inner_cross,则空间内合并的任务的优先级较高
      2. 若系统预设的合并执行优先级是cross_inner,则跨空间合并的任务的优先级较高
    2. 若两个任务都是空间内合并
      1. 顺序空间内合并 > 乱序空间内合并

      2. 优先合并【低层文件(空间内合并次数低的)】:若两个任务的平均每个待合并文件的空间内合并次数不相等,则平均每个文件空间内合并次数低的任务的优先级较高(因为这样可以减少写放大)

      3. 优先合并【文件数量多的】:可以减少大量文件

      4. 优先合并【待合并文件总大小小的】:(因为小文件的合并速度较快)

      5. 优先合并【新文件】:若两个任务的待合并文件的最大version不同,则较大version的任务的优先级高(因为我们想要优先合并最近落盘的文件)

    3. 若两个任务都是跨空间合并
      1. 优先合并【顺序文件少的】:若两个任务的待合并的顺序文件的数量不一样,则顺序文件数量较少的任务的优先级高(因为在合并过程中占用更少的内存)

      2. 乱序文件数量较多的任务的优先级较高(因为会减少更多的乱序文件)


合并任务调度器CompactionSchedule

该类用于根据系统预设的合并策略去创建对应的文件选择器,并使用文件选择器去选择待合并的一批批TsFile并为每一批文件创建一个合并任务(空间内合并、跨空间合并)线程放进CompactionTaskManager的优先级等待队列里。

 

  1. 方法详解

1) static scheduleCompaction (TsFileManagement tsfileManagement, long 分区号)

    • if isAllowCompaction
      • tryToSubmitCrossSpaceCompactionTask()
      • tryToSubmitInnerSpaceCompactionTask(true)
      • tryToSubmitInnerSpaceCompactionTask(false)

2) tryToSubmitCrossSpaceCompactionTask()

    • 根据相应的跨空间合并类型创建对应的文件选择器,将所选到的待合并顺序和乱序文件封装入一个合并任务里,并放进CompactionTaskManager的优先级等待队列里。

3) tryToSubmitInnerSpaceCompactionTask(isSequence)

    • 根据相应的空间内合并类型创建对应的文件选择器,将所选到的待合并文件按批封装入一个个合并任务里,并放进CompactionTaskManager的优先级等待队列里。


合并任务的恢复

IOTDB-Server重启后,每个StorageGroup会执行顺序空间和乱序空间内的合并恢复和跨空间的合并恢复。

StorageGroupProcessor类里:

1)空间内合并恢复

recoverInnerSpaceCompaction(isSeq)方法:对该存储组下的每个时间分区里的每个合并日志创建一个空间内合并恢复线程SizeTieredCompactionRecoverTask,并同步执行恢复流程。

2)跨空间合并恢复

        recoverCrossSpaceCompaction()方法:对该存储组下的每个时间分区里的每个合并日志创建一个空间内合并恢复线程RewriteCrossCompactionRecoverTask,并同步执行恢复流程。


合并任务的定时执行

当server启动后,每个虚拟存储组首先会执行顺序空间和乱序空间内的合并恢复和跨空间的合并恢复,执行完后就会回调submitTimedCompactionTask()方法以定时执行合并任务,具体操作如下:

(1) 从该虚拟存储组下的每个时间分区里依次使用合并任务调度器CompactionSchedule根据合并策略去选择一批批待合并文件,并为每批文件创建一个合并任务线程放进CompactionTaskManager里的线程等待队列里

(2) 从等待队列里获取一个合并线程并执行

  • No labels