合并的整体流程
合并任务管理器CompactionTaskManager
该类负责管理合并任务的运行,例如把合并任务加入到等待队列里,并定时从等待队列里拿取高优先级的线程进行执行。
- 重要属性
- candidateCompactionTaskQueue:合并线程的等待队列,可容纳的任务数量默认为1024个,若满了则会踢掉低优先级的线程
- 两个线程池
- taskExecutionPool:合并任务的执行线程池,系统预设的线程数量为10个
- compactionTaskSubmissionThreadPool:定时执行线程池,该池里的线程负责定时从等待队列里拿取一个合并任务进行执行。系统预设的线程数量为1个。
- runningCompactionTaskList:正在执行合并的任务列表
- currentTaskNum:当前正在执行合并任务的线程数量
- Task_Submit_Interval:每个合并线程执行的时间间隔,系统预设值为1秒
- 合并任务的优先级
candidateCompactionTaskQueue队列里,任务是根据自定义的优先级进行排序的,优先级高的任务会被优先执行。当该队列满时,若添加新的合并任务,则会把优先级最低的给踢掉。下面讲解合并任务的优先级定义规则,在CompactionTaskComparator类里:
- 若两个任务一个是空间内合并,另一个是跨空间合并,且系统预设的合并优先级不是balance
- 若系统预设的合并执行优先级是inner_cross,则空间内合并的任务的优先级较高
- 若系统预设的合并执行优先级是cross_inner,则跨空间合并的任务的优先级较高
- 若两个任务都是空间内合并
顺序空间内合并 > 乱序空间内合并
优先合并【低层文件(空间内合并次数低的)】:若两个任务的平均每个待合并文件的空间内合并次数不相等,则平均每个文件空间内合并次数低的任务的优先级较高(因为这样可以减少写放大)
优先合并【文件数量多的】:可以减少大量文件
优先合并【待合并文件总大小小的】:(因为小文件的合并速度较快)
优先合并【新文件】:若两个任务的待合并文件的最大version不同,则较大version的任务的优先级高(因为我们想要优先合并最近落盘的文件)
- 若两个任务都是跨空间合并
优先合并【顺序文件少的】:若两个任务的待合并的顺序文件的数量不一样,则顺序文件数量较少的任务的优先级高(因为在合并过程中占用更少的内存)
乱序文件数量较多的任务的优先级较高(因为会减少更多的乱序文件)
- 若两个任务一个是空间内合并,另一个是跨空间合并,且系统预设的合并优先级不是balance
合并任务调度器CompactionSchedule
该类用于根据系统预设的合并策略去创建对应的文件选择器,并使用文件选择器去选择待合并的一批批TsFile并为每一批文件创建一个合并任务(空间内合并、跨空间合并)线程放进CompactionTaskManager的优先级等待队列里。
- 方法详解
1) static scheduleCompaction (TsFileManagement tsfileManagement, long 分区号):
- if isAllowCompaction
- tryToSubmitCrossSpaceCompactionTask()
- tryToSubmitInnerSpaceCompactionTask(true)
- tryToSubmitInnerSpaceCompactionTask(false)
- if isAllowCompaction
2) tryToSubmitCrossSpaceCompactionTask()
- 根据相应的跨空间合并类型创建对应的文件选择器,将所选到的待合并顺序和乱序文件封装入一个合并任务里,并放进CompactionTaskManager的优先级等待队列里。
3) tryToSubmitInnerSpaceCompactionTask(isSequence)
- 根据相应的空间内合并类型创建对应的文件选择器,将所选到的待合并文件按批封装入一个个合并任务里,并放进CompactionTaskManager的优先级等待队列里。
- 根据相应的空间内合并类型创建对应的文件选择器,将所选到的待合并文件按批封装入一个个合并任务里,并放进CompactionTaskManager的优先级等待队列里。