批量寫接口設計

概述

場景

IoTDB原先的寫入接口為基于單個時間戳構建單個TSRecord並寫入,此方法的優點在于可以支持非對齊的數據寫入,但因為底層存儲方式的問題,這將會限制用戶在寫入大量對齊數據時的效率。

目標

本功能的開發意圖: 用戶寫入數據時,能夠基于列(傳感器 sensor)批量寫入多行數據,而非基于時間戳一次寫入一行數據。

功能設計

需求說明

根據用戶指定的數據量,將數據批量(多行)寫入指定的傳感器中。

用戶操作方式

  1. 新建一個 TSFileWriter,並將所需的 schema 整理成一數組,向 TsFileWriter 注冊。示例如下:

    File file = new File("test.ts");
    if (file.exists()) {
      file.delete();
    }
    
    TSFileWriter tsFileWriter = new TSFileWriter(file);
    
    int sensorNum = 3;
    
    for (int i = 0; i < sensorNum; i++) {
      fileSchema.registerMeasurement(new MeasurementSchema("sensor_" + (i + 1), TSDataType.INT64, TSEncoding.TS_2DIFF));
    }
    
    for (MeasurementSchema measurement : fileSchema.getMeasurementSchemaList()) {
      tsFileWriter.addMeasurement(measurement);
    }
  2. 定義批量寫入所需的數據量,並且與所要寫入的設備名稱以及 schema 數組一同傳入 RowBatch 對象,這將會根據各個傳感器所支持的數據類型(包括時間戳)在底層新建對應的數組,示例如下:

    int rowNum = 10000000;
    
    RowBatch rowBatch = fileSchema.createRowBatch("device_1");
  3. 向 RowBatch 底層的對應數組傳入每一個傳感器所需寫入的值(用戶需按行構建,每行一 timestamp, 數個 value),當達到 RowBatch 預設的大小時,進行寫入操作,並重置 RowBatch。重複以上動作直到所有數據都已寫入。示例如下:

    long[] timestamps = rowBatch.timestamps;
    int[] sensor1 = (int[]) rowBatch.sensors[0];
    long[] sensor2 = (long[]) rowBatch.sensors[1];
    double[] sensor3 = (double[]) rowBatch.sensors[2];
    
    long timestamp = 1;
    int value1 = 10000000;
    long value2 = 10000000L;
    double value3 = 10000000.0;
    
    for (int r = 0; r < rowNum; r++) {
      int row = rowBatch.size++;
      timestamps[row] = timestamp++;
      sensor1[row] = value1++;
      sensor2[row] = value2++;
      sensor3[row] = value3++;
      // If the batch is full, write it out and start over
      if (rowBatch.size == rowBatch.getMaxSize()) {
        tsFileWriter.write(rowBatch);
        rowBatch.reset();
      }
    }
    
    if (rowBatch.size != 0) {
      tsFileWriter.write(rowBatch);
      rowBatch.reset();
    }

技術方案

  1. 替換數據結構

    原本 TSRecord 中使用 ArrayList 構造需要傳入多個傳感器的數據,也就是使用 ArrayList 按行(時間戳)存儲。這將會使用戶能夠寫入非對齊的數據。

    在批量寫接口中,面向的是寫入對齊的數據,因此調整了存儲方案,更改為按列(傳感器)存儲。這將使用整型數組作為構造數據的主要數據結構,因為對單個傳感器傳入數據時,數據類型是固定的,且整型數組對空間和寫入效率上相對比較友好。

  2. RowBatch 類設計