webentwicklung-frage-antwort-db.com.de

Was ist das Chargenlimit in Cassandra?

Ich habe einen Java Client, der (INSERT) -Datensätze im Batch an Cassandra Cluster verschiebt. Die Elemente im Batch haben alle den gleichen Zeilenschlüssel, also alle wird im selben Knoten abgelegt. Außerdem muss die Transaktion nicht atomar sein, sodass ich einen nicht protokollierten Stapel verwendet habe.

Die Anzahl der INSERT-Befehle in jedem Stapel hängt von verschiedenen Faktoren ab, kann jedoch zwischen 5 und 50000 liegen. Zuerst habe ich nur so viele Befehle wie in einem Stapel abgelegt und sie gesendet. Dies warf com.datastax.driver.core.exceptions.InvalidQueryException: Batch too large. Dann habe ich eine Obergrenze von 1000 EINFÜGEN pro Charge verwendet und dann auf 300 herabgesetzt. Mir ist aufgefallen, dass ich nur nach dem Zufallsprinzip rate, ohne genau zu wissen, woher diese Grenze kommt, was später zu Problemen führen kann.

Meine Frage ist, was ist diese Grenze? Kann ich das ändern? Woher weiß ich, wie viele Elemente in einem Stapel platziert werden können? Wann ist meine Charge "voll"?

22
m.hashemian

Ich würde empfehlen, die Obergrenze nicht zu erhöhen und nur in mehrere Anfragen aufzuteilen. Wenn Sie alles in eine riesige Einzelanfrage einfügen, wirkt sich dies erheblich auf den Koordinator aus. Wenn sich alles in einer Partition befindet, kann der Durchsatz bei Stapeln bestimmter Größe verbessert werden, indem die Latenz verringert wird. Die Verwendung von Stapeln zur Verbesserung der Leistung ist jedoch niemals beabsichtigt. Daher hängt der Versuch, den maximalen Durchsatz durch die Verwendung unterschiedlicher Stapelgrößen zu optimieren, weitgehend vom Anwendungsfall/Schema/Knoten ab und erfordert spezielle Tests, da es im Allgemeinen eine Klippe in Bezug auf die Größe gibt, in der sich die Leistung verschlechtert.

Da ist ein

# Fail any batch exceeding this value. 50kb (10x warn threshold) by default.
batch_size_fail_threshold_in_kb: 50

option in Ihrem cassandra.yaml, um es zu erhöhen, aber stellen Sie sicher, dass Sie testen, um sicherzustellen, dass Sie tatsächlich helfen und Ihren Durchsatz nicht beeinträchtigen.

27
Chris Lohfink

Wenn Sie sich die Cassandra Protokolle ansehen, werden Sie Dinge wie Folgendes erkennen können:

FEHLER 19:54:13 Der Stapel für [Übereinstimmungen] hat eine Größe von 103,072 KB und überschreitet den angegebenen Schwellenwert von 50,000 KB um 53,072 KB. (siehe batch_size_fail_threshold_in_kb)

4
fivetwentysix

Ich habe dieses Problem behoben, indem ich CHUNKSIZE auf einen niedrigeren Wert geändert habe (zum Beispiel 1) https://docs.datastax.com/en/cql/3.1/cql/cql_reference/copy_r.html

COPY mytable FROM 'mybackup' WITH CHUNKSIZE = 1;

Die Operation ist viel langsamer, aber zumindest funktioniert sie jetzt

3
Etienne Cha