关于 IoTDB 的 Q & A
IoTDB Q&A 第三期持续更新!我们将定期汇总我们将定期汇总社区讨论频繁的问题,并展开进行详细回答,通过积累常见问题"小百科",方便大家使用 IoTDB。
Q1:查询最新值 & null 数据相加方法
问题现象 1
如果我想查 1000 个点的最新值,这些点的设备地址可能都不相同,那么我怎么查?
解决方案
-
from 后面可以写多个设备
-
select 后面也可以写多个测点
-
还可以用通配符
问题现象 2
在版本 1.1.1 中,group by 遇到两列数据相加时,其中一列为 null,另一列属性不为 null,导致两者相加之后为 null,有类似 ifnull 的函数处理这种问题吗?
以下是 SQL:
sql
select (last_value(APM.1value) +last_value(APM2.value)) as val from root.dec group by ([10000,20000), 60s,10s)alse])
解决方案
可以用 case when 来实现,用户手册中有使用参考:
https://iotdb.apache.org/zh/UserGuide/latest/SQL-Manual/Function-and-Expression.html#case
Q2:集群中某一节点掉线导致删除序列失败
问题
1.3.2 版本三台机器的集群部署,删除时间序列时,三台机器都在线没问题,掉了一台机器之后报错,请问是什么原因?
原因
当前版本中,删除序列时所有元数据引擎的缓存都需要强一致性失效,某一节点不能成功则全部失败。因此元数据删除操作是必须要求所有节点都在线的。
方案
恢复集群异常节点的状态,再进行删除操作。
Q3:查询时报可用内存不足
现象
3C3D 集群中,进行查询时报可用内存不足,即使是 show devices 这样简单的查询也会报内存不足。
原因
- 客户目前使用的 JDK 版本是 1.8, 该版本 JDK 对 GC 控制效果不佳,有可能出现可用内存不足的情况,同时 GC 耗时较长,内存得不到及时释放。
- 集群 3 个节点之间网络延迟不一致,影响了集群间通信,导致节点之间吞吐不一致。
解决方案
- 升级 JDK 版本,由 JDK1.8 升级到 JDK17, 高版本 JDK 相比低版本有如下提升:
- **性能优化:**JDK 17 的默认垃圾收集算法为 G1,提供了更好的吞吐量和更短的停顿时间,这对于提高应用程序的整体性能和用户体验非常有帮助。
- **更好的内存管理:**JDK 17 提供了更先进的内存管理功能,包括更强的封装和更有效的内存分配策略,这有助于提高内存使用效率和减少内存泄漏。
- 解决集群间网络延迟不一致的问题。
采用上述解决方案后,查询可用内存不足的问题得到解决,同时查询效率得到明显提升。
启示
以后如果遇到集群性能发挥不佳的情况,可以排查一下集群间的网络延迟情况,这个对集群性能影响还是比较大的。
Q4:Continuous Query 在 ConfigNode 运行还是在 DataNode 运行
问题
请问 Continuous Query 在 ConfigNode 运行还是在 DataNode 运行?
解答
Continuous Query 执行阶段运行在 DataNode 中,但 Continuous Query 的调度和控制阶段(比如定时向 DataNode 发起查询)是在 ConfigNode 发生的。
IoTDB 中的 ConfigNode 仅用于做集群管理及节点调度等,所有与元数据/数据相关的操作均在 DataNode 节点上进行。
Q5:IoTDB 升级后 Trigger 不可用
问题现象
目前将 1.3.2 版本升级到了 1.3.3(通过替换 lib 的方式)。替换后发现原有触发器,show triggers 显示 active,但实际并未生效。卸载安装后依旧无法监听路径上的插入数据,不知道触发器逻辑是否有变更?没有发现异常日志,回退 1.3.2 版本后正常。
原因
Apache TsFile 目前已经独立成了一个项目,原来在 TsFile 下的类的包名都发生了变化,因此 Trigger 中依赖的 TsFile 路径发生了变化,需要重新打包注册。
方案
-
需要更新依赖版本 iotdb-server 重新打包注册插件。
-
UDF、Pipe 同理。
Q6: 数据类型相关问题
指定数据类型
问题 1
通过 tools/import-data.sh 导入数据时,发现默认推断类型配置没有生效,请问是什么原因?
现象
解决方案
通过 tools/import-data.sh 命令导入数据时,需要指定 -typeInfer 参数,用于指定类型推断规则,如:
<srcTsDataType1=dstTsDataType1,srcTsDataType2=dstTsDataType2,...>
-
srcTsDataType 包括 boolean,int,long,float,double,NaN;
-
dstTsDataType 包括 boolean,int,long,float,double,text;
-
当 srcTsDataType 为 boolean,dstTsDataType 只能为 boolean 或 text;
-
当 srcTsDataType 为 NaN, dstTsDataType 只能为 float, double 或 text;
-
当 srcTsDataType 为数值类型, dstTsDataType 的精度需要高于 srcTsDataType。
设置举例:-typeInfer boolean=text,float=double。
数据小数点位数是否影响查询性能
问题 2
存 double 型数据,截短保留 2 位小数和不截短,在查询效率和速度上有没有区别?
回答
没有,double 的长度和小数位数没太大关系。
升级后数据转换问题
问题 3
上面的查询在 1.0 版本是没问题的,1.3.2 版本就提示转换错误,这个可以设置吗,还是新版本只能这样转换?
回答
这个是因为尝试将字符串 'bad' 转成 float 时出错了。
也可用正则表达式替换处理:
sql
select avg(cast(regexreplace(v, 'regex'='^[A-Za-z]+$', 'replace'='1', 'limit'='2'), 'type'='FLOAT')) as V,
avg(cast(regexreplace(v1, "regex"="^[A-Za-z]+$", "replace"="0", "limit"="1"), 'type'='FLOAT')) as V1 from root.ln.d2 where time>=2024-11-20 00:00:00 and time<=2024-11-26 00:00:00 group by ([2024-11-20T00:00:00,2024-11-26T00:00:00 ),1d)
规上企业应用实例