2017-12-28 5 views
0

Ich füge in eine Cassandra 3.12 über den Python (DataStax) Treiber und CQL BatchStatements [1]. Mit einem Primärschlüssel, der zu einer kleinen Anzahl von Partitionen (10-20) führt, funktioniert alles gut, aber die Daten sind nicht gleichmäßig über die Knoten verteilt.Kardinalität der Primärschlüssel verursacht Partition zu große Fehler?

Wenn ich eine Spalte mit hoher Kardinalität, z. B. Uhrzeit oder Client-IP, zusätzlich zum Datum einfüge, führen die Stapeleinfügungen zu einem zu großen Partitionsfehler, obwohl die Anzahl der Zeilen und die Zeilenlänge identisch sind.

Höhere Kardinalitätsschlüssel sollten zu mehr, aber kleineren Partitionen führen. Wie führt ein Schlüssel, der mehr Partitionen generiert, zu diesem Fehler?


[1] Obwohl alles, was ich gelesen habe deutet darauf hin, dass Batch-Einsätze können ein Anti-Muster sein, mit einer Charge nur eine Partition abdeckt, habe ich noch den höchsten Durchsatz im Vergleich zu async oder aktuellen Einsätzen für diesen Fall sehen.


CREATE TABLE test ( date date, time time, cid text, loc text, src text, dst text, size bigint, s_bytes bigint, d_bytes bigint, time_ms bigint, log text, PRIMARY KEY ((date, loc, cid), src, time, log) ) WITH compression = { 'class' : 'LZ4Compressor' } AND compaction = {'compaction_window_size': '1', 'compaction_window_unit': 'DAYS', 'class': 'org.apache.cassandra.db.compaction.TimeWindowCompactionStrategy'};

+0

Wie groß ist die Größe der Spalte, die Sie in den Partitionsschlüssel verschoben haben? –

+0

@AlexOtt In der obigen Tabelle wurde das Datum (Datum) durch eine Zeitstempelspalte ersetzt. Wenn ich sowohl Daten als auch Zeitspalten einschließe, bekomme ich das gleiche Problem. Ich verweise auf die Kardinalität, weil die Addition von Zeit zu viel mehr Partitionen führen sollte (wegen der Auflösung), aber die Zeilengröße nicht ändert. Ich glaube nicht, dass ich so viele Partitionen brauche, aber ich versuche die Beziehung zwischen dem Primärschlüssel und dem Fehler zu verstehen. – MattK

Antwort

2

Ich denke, man Caused by: com.datastax.driver.core.exceptions.InvalidQueryException: Batch too large Fehler gemeint?

Dies ist wegen der Parameter batch_size_fail_threshold_in_kb der standardmäßig 50kB von Daten in einer einzigen Charge ist - und es gibt auch Warnungen an einem früher bei 5Kb Schwelle durch batch_size_warn_threshold_in_kb in cassandra.yml (siehe http://docs.datastax.com/en/archived/cassandra/3.x/cassandra/configuration/configCassandra_yaml.html).

Können Sie Ihr Datenmodell teilen? Das Hinzufügen einer Spalte bedeutet nicht, dass der Partitionsschlüssel geändert werden muss - vielleicht haben Sie den Primärschlüssel nur durch Hinzufügen einer Clusterspalte geändert. Hinweis: PRIMARY KEY (a,b,c,d) verwendet nur a als Partitionsschlüssel, während PRIMARY KEY ((a,b),c,d)a,b als Partitionsschlüssel verwendet - ein leicht übersehener Fehler.

Abgesehen davon nimmt die zusätzliche Spalte etwas Platz in Anspruch - Sie können also jetzt problemlos den Schwellenwert erreichen, reduzieren Sie einfach die Batchgröße, damit sie wieder in die Grenzwerte passt. Im Allgemeinen ist es ein guter Weg, um den Effekt nur auf eine einzelne Partition anzuwenden, wie Sie bereits erwähnt haben. Verwenden Sie auch Async-Abfragen und führen Sie parallele Anfragen an verschiedene Koordinatoren durch, um eine höhere Geschwindigkeit zu erreichen.

+0

Ich werde das Datenmodell veröffentlichen, aber in diesem Fall werde ich keine Spalten hinzufügen, sondern eine in die PK verschieben, die eine höhere Kardinalität als die anderen hat. Die Zeilenbreite bleibt gleich. – MattK

+0

Tabelle oben hinzugefügt. – MattK

+0

Das Problem war in der Tat die Größe des Batches eingefügt, nicht die Größe der resultierenden Partitionen. – MattK

Verwandte Themen