目标

写一个负载程序使得IoTDB能在长期写入,覆盖层级合并、顺序乱序合并,实际删除数据,重启下,数据能够正确查询。

运行命令

java -jar XXX.jar -username root...

可配置项

组数(storageGroupNumber),设备数(deviceNumber),每个设备sensor数量(sensorNumber),循环重复插入查询次数(Loop,从零开始),写入模式(顺序,乱序,删除)。

数据规模案例

例如,10组,每组10个设备,每个设备10个sensor (sg1~sg10, d1~d10, s1~s10)。

1. 普通写入查询

例如,10组X10设备X10个sensor=1000个sensor写入。单客户端写入。写入之后立即查询。

步骤一:写入

每个sensor写入十万个数据点

例如设备d1

times1s2...s10
111...1
222...2
...............
100000100000100000100000100000

步骤二:原始数据部分查询

单设备单传感器

随机在[1,100000 * (Loop + 1)]中选择1个时间点T,查询[T-999, T]数据。如果T选择在[1,1000],那么就查[1,1000]的数据。随机选择一个组(sgN, 1<= N <= 组数)一个设备(dN, 1<= N <= 设备数),再随机选择2个传感器(sN,1<=N <= 传感器数)。总共两次查询。

例如设备d1

select s1 from root.sg1.d1 where time >= 100 and time <= 1099
select s10 from root.sg1.d1 where time >= 1201 and time <= 2200
多设备单传感器

随机在[1,100000 * (Loop + 1)]中选择1个时间点T,查询[T-999, T]数据。如果T选择在[1,1000],那么就查[1,1000]的数据。随机选择一个组,设备全选,随机选择2个传感器。总共两次查询。

例如

select s1 from root.sg1.d1, root.sg1.d2, ..., root.sg1.d10 where time >= 100 and time <= 1099
select s4 from root.sg1.d1, root.sg1.d2, ..., root.sg1.d10 where time >= 1201 and time <= 2200
单设备多传感器

随机在[1,100000 * (Loop + 1)]中选择1个时间点T,查询[T-999, T]数据。如果T选择在[1,1000],那么就查[1,1000]的数据。随机选择一个组一个设备,传感器全选。总共一次查询。

例如

select s1, s1, ...,s10 from root.sg1.d1 where time >= 100 and time <= 1099

步骤三:聚合查询

单设备单传感器

随机在[1,100000 * (Loop + 1)]中选择1个时间点T,查询[T-999, T]数据。如果T选择在[1,1000],那么就查[1,1000]的数据。随机选择一个组一个设备,再随机选择2个传感器。总共四次查询。聚合函数分别为last_value,count

select count(s1) from root.sg1.d1 where time >= 1001 and time <= 2000
select last_value(s1) from root.sg1.d1 where time >= 3001 and time <= 4000
select count(s100) from root.sg1.d1 where time >= 4001 and time <= 5000
select last_value(s100) from root.sg1.d1 where time >= 5001 and time <= 6000
多设备单传感器

和原始数据同理

单设备多传感器

和原始数据同理

步骤四:聚合查询全时间范围

单设备单传感器

随机在[1,100000 * (Loop + 1)]中选择1个时间点T,查询[T-999, T]数据。如果T选择在[1,1000],那么就查[1,1000]的数据。随机选择一个组一个设备,再随机选择2个传感器。总共四次查询。聚合函数分别为last_value,count

select count(s1) from root.sg1.d1
select last_value(s1) from root.sg1.d1
select count(s10) from root.sg1.d1
select last_value(s10) from root.sg1.d1
多设备单传感器

和原始数据同理

单设备多传感器

和原始数据同理

步骤五:降采样查询

单设备单传感器

例如设备d1

随机在[1,100000 * (Loop + 1)]中选择1个时间点T,查询[T-999, T]数据。如果T选择在[1,1000],那么就查[1,1000]的数据。步长为100。随机选择一个组一个设备,再随机选择2个传感器。总共六次查询。聚合函数分别为last_value, first_value, count

select first_value(s1) from root.sg1.d1 group by ((1000, 2000], 10)
select last_value(s1) from root.sg1.d1 group by ((3000, 4000], 10)
select count(s1) from root.sg1.d1 group by ((4000, 5000], 10)
select first_value(s100) from root.sg1.d1 group by ((5000, 6000], 10)
select last_value(s100) from root.sg1.d1 group by ((7000, 8000], 10)
select count(s100) from root.sg1.d1 group by ((9000, 10000], 10)
多设备单传感器

和原始数据同理

单设备多传感器

和原始数据同理

重复写入查询

每个sensor再写入十万个数据点

例如设备d1

times1s2...s10
100001100001100001...100001
100002100002100002...100002
...............
200000200000200000200000200000

重复上述操作

2. 乱序写入查询

步骤一:执行1. 普通写入查询

步骤二:执行flush操作

步骤三:写入乱序点

随机选择一个sensor,随机在[1,100000 * (Loop + 1)]中选择1个时间点T,插入[T-999, T]的乱序数据并且乱序数据全部加一。

例如设备d1

times1s2...s100
990019900299002...99002
990029900399003...99003
...............
100000100001100001100001100001

步骤四:查询

随机在[T-999,T]选择一个点K,查询[K-999,K]。其余全部和1. 普通写入查询同理。

步骤五:重复写入查询

重复上述操作。

3. 删除写入查询

步骤一:执行1. 普通写入查询

步骤二:删除点

随机选择一个sensor,随机在[1,100000 * (Loop + 1)]中选择1个时间点T,删除[T-999, T]的数据。

步骤三:原始数据部分查询

随机在[T-999,T]选择一个点K,查询[K-999,K]。其余全部和1. 普通写入查询同理。

4. 验证正确性

顺序数据插入数据与时间一致,且为INT64类型。乱序数据插入数据与时间+1一致。如果出现不一致的数据,将不一致的数据和sql打印到日志里。

  • No labels

1 Comment

  1. 有几个问题:

    1 写入数据的正确性验证,我觉得应该是已知写入的内容,完成写入后,马上查询这个值,比较查询出来的值是否和写入一致,这里如果用范围点的条件,首先考虑查出来的结果怎么比,另外是否能完全覆盖每个写入的值都能和查询结果作比较。

    2 count和上面类似,先说count一个范围,应该先不通过DB自己函数的方法得到预计的count数量,然后和DB的count函数得到的结果做对比,实际这是对count函数功能正确性的检查,因为count得到的值并没有写入库中。进一步如果就count基础数据的记录数,应该是在完成指定规模数据写入后,执行一个count得到数量,和已知的这组操作应该写入的记录数比较。

    3 last_value,和count类似,本身应该是针对函数的正确性验证,应该使用非DB的手段,执行得到正确预期值,然后和DB的last_value函数得到的结果进行比较。

    4 对于顺序写入和乱序写入,是否要分开验证,因为我的理解是,数据写入之后,本身不会识别出写入的是乱序还是顺序,而且查询正确性的话应该是通过时间戳等唯一条件进行查询,查询到的记录就是物理文件,而如果按范围查询,如果系统启动了排序机制,显示的是读入内存的内容,对于数据正确来说分两步:一个是写入的值无论顺序乱序是否正确,一个是读出来的内容是否自动排序,前者已经随写入的时候验证了,后者实际是排序相关的作用。