batchPoints mit influxdb-java werden überschrieben, es sei denn, es wird eine eindeutige Zeit erzwungen?

Oct 15 2020

Mein Projekt verwendet derzeit influxdb-java , um eine Verbindung zu Influx 1.8.2 herzustellen. Derzeit sieht mein Code ungefähr so ​​aus:

InfluxDB connection = InfluxDBFactory.connect(server, client);
connection.enableBatch(100,10,TimeUnit.MILLISECONDS);
connection.setDatabase(database);
BatchPoints batchPoints = BatchPoints.database(database).build();

long currTime = System.currentTimeMillis()*1000000;
double[] data1 = getInfluxData();
for (int i=someInt; i < data1.length; i++){
    if (i % someInt == 0){
        double[] data2 = processData(data1, i-someInt, i);
        for (int j=0; j < data2.length; j++){
            Point p = Point.measurement(someTable)
                .time(currTime+i+j, TimeUnit.NANOSECONDS)   //Line A (j < someInt)
                .tag("someTag", "someTagValue")
                .addField("someField", data2[j])
                .build();
            batchPoints.point(p)
        }
}
connection.write(batchPoints);
connection.disableBatch();
connection.close();

Derzeit Line Amuss vorhanden sein, sonst scheinen sich meine Punkte selbst zu überschreiben und nur 1 Punkt wird tatsächlich ausgeschrieben someTable. Es Line Aist also eine hackige Lösung, aber nur so kann ich alle Punkte ausschreiben. Die Inspiration für die Verwendung solcher BatchPoints stammte von Influx-eigenen Beispielleistungstests, bei denen nicht einmal eine Zeit angegeben wurde. Also, was mache ich falsch, was dazu führt, dass die Punkte überschrieben werden, wenn nicht für Line A? Könnte stattdessen influxdb-client-java wechseln , nur für den Kontext, falls dies dieses Problem lindern könnte.

Antworten

1 robert Oct 17 2020 at 04:43

In InfluxDB werden alle Punkte mit denselben Tag-Werten und Zeitstempeln, auch wenn unterschiedliche Feldwerte vorliegen, als doppelt betrachtet. Solche Datenpunkte werden also stillschweigend überschrieben. Dies entspricht dem InfluxDB- Design .

Is it a limitation of influx that only one point can exist with the same tags and timestamp?

Ja, das ist beabsichtigt.

If a collision does occur, does the old one get overwritten?

Ja, es wird stillschweigend überschrieben.

Dies ist dokumentiert, aber nicht gut. Ich habe influxdata / influxdb.com # 324 geöffnet, um das zu beheben.

1 Phil Oct 16 2020 at 18:08

@Isaac -

Wenn Sie InfluxDB 1.8+ verwenden, würde ich in Betracht ziehen, auf das zu wechseln, influxdb-client-javada es anscheinend häufiger gewartet wird.

Für Ihr Codebeispiel influxdb-javawird der BatchPoints-Builder nicht idiomatisch verwendet. Ich würde testWritePerformanceim Beispiel sagen, dass Tests auch seltsam sind und dieser Test deaktiviert ist.

Ich entlasse einen Großteil Ihres Codes.

// setup ...

BatchPoints.Builder batchPointsBuilder = BatchPoints.database(database);

// start for loops ...

batchPointsBuilder.point(p);

// finish loops ...

connection.write(batchPointsBuilder.build());


// setdown

ABER wenn ich mir den Java-Code und Ihren ansehe, denke ich nicht, dass dies das Problem ist, ebenso wenig wie point(Point p)das Anhängen von Points an a List. Es sollte hier also nicht überschrieben werden.

Wenn Sie den Zeitstempel weglassen, erhalten alle Punkte den gleichen Zeitstempel, da der Stapel auf einmal eintrifft (auf diese Weise wird in InfluxDB ein ausgelassener Zeitstempel ermittelt - wenn der Punkt eintrifft). Ich kann Ihre Daten und Tags nicht sehen, aber wenn alle Punkte mit Feldschlüsseln, Tag-Schlüsseln, Tag-Werten und Zeitstempel identisch sind, überschreiben / ersetzen sie sich gegenseitig. Ich vermute, dass Ihre Daten / Tags / Felder unterschiedlich sein sollen. Überprüfen Sie es noch einmal.

Zuletzt möchte ich Sie überprüfen lassen (und teilen, wenn Sie so wollen), woher Sie wissen, dass alle Punkte sich selbst überschreiben? Welche Abfrage verwenden Sie?

~ Ihr Beispielcode enthält einen Tippfehler bei for (int i=someInt; i < data.length; i++){- sollte sein data1. ~