Table of Contents
总体流程
主要代码:org.apache.iotdb.tsfile.write.*
TsFile 的写入流程如下图所示:
其中,每个设备对应一个 ChunkGroupWriter,每个传感器对应一个 ChunkWriter。
文件的写入主要分为三种操作,在图上用 1、2、3 标注
1、写内存缓冲区
2、持久化数据
3、关闭文件
1、写内存缓冲区
TsFile 文件层的写入接口有两种
* TsFileWriter.write(TSRecord record)
写入一个设备一个时间戳多个测点。
* TsFileWriter.write(Tablet tablet)
写入一个设备多个时间戳多个测点。
当调用 write 接口时,这个设备的数据会交给对应的 ChunkGroupWriter,其中的每个测点会交给对应的 ChunkWriter 进行写入。ChunkWriter 完成编码和打包(生成 Page)。
2、持久化 ChunkGroup
* TsFileWriter.flushAllChunkGroups()
当内存中的数据达到一定阈值,会触发持久化操作。每次持久化会把当前内存中所有设备的数据全部持久化到磁盘的 TsFile 文件中。每个设备对应一个 ChunkGroup,每个测点对应一个 Chunk。
持久化完成后会在内存中缓存对应的元数据信息,以供查询和生成文件尾部 metadata。
3、关闭文件
* TsFileWriter.close()
根据内存中缓存的元数据,生成 TsFileMetadata 追加到文件尾部 (`TsFileWriter.flushMetadataIndex()`),最后关闭文件。
生成 TsFileMetadata 的过程中比较重要的一步是建立元数据索引 (MetadataIndex) 树。正如我们提到过的,元数据索引采用树形结构进行设计的目的是在设备数或者传感器数量过大时,可以不用一次读取所有的 TimeseriesMetadata,只需要根据所读取的传感器定位对应的节点,从而减少 I/O,加快查询速度。
设备-物理量索引树构造流程
以下是建立元数据索引树的详细算法和过程:
* org.apache.iotdb.tsfile.file.metadata.MetadataIndexConstructor
MetadataIndexConstructor.constructMetadataIndex()
方法的输入包括:
- Map<String, List<TimeseriesMetadata>> deviceTimeseriesMetadataMap,表示设备到其 TimeseriesMetadata 列表的映射
- TsFileOutput out,是包装好的 TsFile output
...