写点什么

IoTDB 常见问题 Q&A 第三期

作者:Apache IoTDB
  • 2025-01-12
    北京
  • 本文字数:2118 字

    阅读完需:约 7 分钟

IoTDB 常见问题 Q&A 第三期

关于 IoTDB 的 Q & A


IoTDB Q&A 第三期持续更新!我们将定期汇总我们将定期汇总社区讨论频繁的问题,并展开进行详细回答,通过积累常见问题“小百科”,方便大家使用 IoTDB。


Q1:查询最新值 & null 数据相加方法


问题现象 1


如果我想查 1000 个点的最新值,这些点的设备地址可能都不相同,那么我怎么查?


解决方案


1. from 后面可以写多个设备

2. select 后面也可以写多个测点

3. 还可以用通配符


问题现象 2


在版本 1.1.1 中,group by 遇到两列数据相加时,其中一列为 null,另一列属性不为 null,导致两者相加之后为 null,有类似 ifnull 的函数处理这种问题吗?


以下是 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 这样简单的查询也会报内存不足。



原因


1. 客户目前使用的 JDK 版本是 1.8, 该版本 JDK 对 GC 控制效果不佳,有可能出现可用内存不足的情况,同时 GC 耗时较长,内存得不到及时释放。



2. 集群 3 个节点之间网络延迟不一致,影响了集群间通信,导致节点之间吞吐不一致。



解决方案


1. 升级 JDK 版本,由 JDK1.8 升级到 JDK17, 高版本 JDK 相比低版本有如下提升:


  • 性能优化:JDK 17 的默认垃圾收集算法为 G1,提供了更好的吞吐量和更短的停顿时间,这对于提高应用程序的整体性能和用户体验非常有帮助。


  • 更好的内存管理:JDK 17 提供了更先进的内存管理功能,包括更强的封装和更有效的内存分配策略,这有助于提高内存使用效率和减少内存泄漏。


2. 解决集群间网络延迟不一致的问题。


采用上述解决方案后,查询可用内存不足的问题得到解决,同时查询效率得到明显提升。


启示


以后如果遇到集群性能发挥不佳的情况,可以排查一下集群间的网络延迟情况,这个对集群性能影响还是比较大的。


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 时出错了。



也可用正则表达式替换处理:

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)
复制代码


用户头像

Apache IoTDB

关注

还未添加个人签名 2021-12-30 加入

海量时序数据管理的解决方案,一款高吞吐、高压缩、高可用、物联网原生的开源时序数据库。

评论

发布
暂无评论
IoTDB 常见问题 Q&A 第三期_Apache IoTDB_InfoQ写作社区