背景简介

某用户使用IoTDB 0.11.2-SNAPSHOT版本管理时间序列,分配给JVM 48GB内存,并且在数据写入阶段禁止了乱序合并,即

enable_unseq_compaction = false

写出来的乱序文件在10-30KB不等,有一些合并到1层的顺序文件,如下,以其中一个设备为例,有25000+乱序小文件,3个顺序文件

之后,用户想要在0.11.4上进行乱序合并,设置乱序合并每次合并文件个数阈值参数如下,理论上应该在几次内合并完乱序文件

unseq_file_num_in_each_level = 1000000

但是乱序合并选择出现了如下日志,并且之后乱序合并过程未进行

排查过程

将该设备数据文件拷贝到本地,debug发现该设备写出的数据有一些时间戳非常大的数据,如文件1617705224662-83-0.tsfile,并且这个文件没有被关闭

因此怀疑这样一种情况,乱序数据均在这个文件之前(乱序文件endTime小于该文件的startTime),即都与这个文件重叠

在这种情况下应该同时选出所以乱序文件及该顺序文件,但是又因为该顺序文件是未关闭的,所以所有乱序文件均被剔除待合并文件列表,如下,选不出待合并文件

因此,我们删除该顺序文件再触发合并做一个验证

成功选出了大量的乱序文件进行合并

解决方法

1、首先写脚本清除用户的错误数据

2、清除后以后手动执行合并前必须要运行flush关闭文件


  • No labels