目标
写一个负载程序使得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
time | s1 | s2 | ... | s10 |
---|---|---|---|---|
1 | 1 | 1 | ... | 1 |
2 | 2 | 2 | ... | 2 |
... | ... | ... | ... | ... |
100000 | 100000 | 100000 | 100000 | 100000 |
步骤二:原始数据部分查询
单设备单传感器
随机在[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
time | s1 | s2 | ... | s10 |
---|---|---|---|---|
100001 | 100001 | 100001 | ... | 100001 |
100002 | 100002 | 100002 | ... | 100002 |
... | ... | ... | ... | ... |
200000 | 200000 | 200000 | 200000 | 200000 |
重复上述操作
2. 乱序写入查询
步骤一:执行1. 普通写入查询
步骤二:执行flush操作
步骤三:写入乱序点
随机选择一个sensor,随机在[1,100000 * (Loop + 1)]中选择1个时间点T,插入[T-999, T]的乱序数据并且乱序数据全部加一。
例如设备d1
time | s1 | s2 | ... | s100 |
---|---|---|---|---|
99001 | 99002 | 99002 | ... | 99002 |
99002 | 99003 | 99003 | ... | 99003 |
... | ... | ... | ... | ... |
100000 | 100001 | 100001 | 100001 | 100001 |
步骤四:查询
随机在[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打印到日志里。
1 Comment
mingli
有几个问题:
1 写入数据的正确性验证,我觉得应该是已知写入的内容,完成写入后,马上查询这个值,比较查询出来的值是否和写入一致,这里如果用范围点的条件,首先考虑查出来的结果怎么比,另外是否能完全覆盖每个写入的值都能和查询结果作比较。
2 count和上面类似,先说count一个范围,应该先不通过DB自己函数的方法得到预计的count数量,然后和DB的count函数得到的结果做对比,实际这是对count函数功能正确性的检查,因为count得到的值并没有写入库中。进一步如果就count基础数据的记录数,应该是在完成指定规模数据写入后,执行一个count得到数量,和已知的这组操作应该写入的记录数比较。
3 last_value,和count类似,本身应该是针对函数的正确性验证,应该使用非DB的手段,执行得到正确预期值,然后和DB的last_value函数得到的结果进行比较。
4 对于顺序写入和乱序写入,是否要分开验证,因为我的理解是,数据写入之后,本身不会识别出写入的是乱序还是顺序,而且查询正确性的话应该是通过时间戳等唯一条件进行查询,查询到的记录就是物理文件,而如果按范围查询,如果系统启动了排序机制,显示的是读入内存的内容,对于数据正确来说分两步:一个是写入的值无论顺序乱序是否正确,一个是读出来的内容是否自动排序,前者已经随写入的时候验证了,后者实际是排序相关的作用。