如何在Apache IoTDB的同一毫秒插入多条时间序列数据?需关注数据结构吗?
关于Apache IoTDB同一毫秒插入多条时间序列数据的实现方案
一、同一毫秒内插入多条数据的直接实现方式
IoTDB原生支持同一毫秒时间戳的多数据插入,核心是利用批量插入接口,以下是两种常用场景的实现方式:
- 使用
insertRecords接口:适合多设备、同时间戳的场景。构造包含相同毫秒级时间戳的多条记录,一次性提交即可。示例代码:
Session session = new Session("127.0.0.1", 6667, "root", "root"); session.open(); long targetMs = System.currentTimeMillis(); // 多设备、多测点的同时间戳数据 List<String> deviceIds = Arrays.asList("root.factory.device1", "root.factory.device2"); List<List<String>> measurements = Arrays.asList( Arrays.asList("temperature", "humidity"), Arrays.asList("voltage", "current") ); List<List<Object>> values = Arrays.asList( Arrays.asList(24.5f, 58), Arrays.asList(220.1, 1.2) ); // 所有记录使用同一毫秒时间戳 List<Long> timestamps = Arrays.asList(targetMs, targetMs); session.insertRecords(deviceIds, timestamps, measurements, values); session.close();
- 使用
insertTablet接口:适合单设备、同时间戳下多测点的场景,这种方式存储和插入效率更高,因为IoTDB会将同设备同时间戳的测点数据作为一个连续数据块处理。示例代码:
Session session = new Session("127.0.0.1", 6667, "root", "root"); session.open(); long targetMs = System.currentTimeMillis(); String deviceId = "root.factory.device1"; List<String> measurements = Arrays.asList("temperature", "humidity", "pressure"); List<TSDataType> types = Arrays.asList(TSDataType.FLOAT, TSDataType.INT32, TSDataType.DOUBLE); // 创建Tablet,指定初始行数为1 Tablet tablet = new Tablet(deviceId, measurements, types, 1); int rowIdx = tablet.rowSize++; tablet.addTimestamp(rowIdx, targetMs); tablet.addValue("temperature", rowIdx, 24.8f); tablet.addValue("humidity", rowIdx, 59); tablet.addValue("pressure", rowIdx, 101.3); session.insertTablet(tablet); session.close();
二、数据结构设计的关键考量
要高效实现同一毫秒插入,数据结构设计是核心前提:
- 存储组划分:把同一毫秒内有数据产生的设备归到同一个存储组下。IoTDB会将同存储组的数据写入同一批文件,减少磁盘寻址和IO次数,大幅提升批量插入效率。
- 测点规划:如果某些测点总是在同一毫秒同步产生数据,不要将它们拆分到不同设备下,尽量放在同一设备的多个测点中,这样可以最大化利用
insertTablet的高效批量处理能力。 - 数据类型统一:同一测点的数据类型必须保持一致,避免插入时的类型转换开销;同设备的测点尽量选择对齐的数据类型,优化内存中数据块的存储结构。
三、提升插入效率的调整建议
除了实现方式和结构设计,还可以通过参数调整进一步优化性能:
- 开启批量插入:将同一毫秒的多条数据收集到一定数量后再提交,减少网络交互次数。可以通过
session.setBatchSize(1000)设置批量大小,根据实际场景灵活调整。 - 调整存储组相关参数:修改
iotdb-engine.properties中的配置:- 调大
wal_buffer_size:增加WAL缓冲区大小,减少刷盘频率,适配批量插入场景; - 调整
group_size_in_byte:根据批量数据的大小设置存储组文件的阈值,避免频繁生成新文件。
- 调大
- 关闭不必要的校验:如果能确保插入数据的合法性,可以将
enable_insertion_check设为false,跳过数据校验步骤,降低性能损耗。 - 使用SessionPool:多线程插入场景下,用SessionPool复用连接,避免频繁创建、销毁Session的开销,提升并发插入的效率。
内容的提问来源于stack exchange,提问作者zai
相关产品推荐
相关产品推荐

