2010-08-20 11 views
7

Ich habe eine Cassandra ColumnFamily (0.6.4), die neue Einträge von Benutzern haben wird. Ich möchte Cassandra nach diesen neuen Einträgen abfragen, damit ich diese Daten in einem anderen System verarbeiten kann.Wie abzufragen Cassandra nach Zeitraum

Mein Gefühl war, dass ich einen TimeUUIDType als Schlüssel für meine Eingabe verwenden konnte, und dann auf eine KeyRange abfragen, die entweder mit "" als startKey oder was auch immer der lastStartKey war. Ist das die richtige Methode?

Wie erstellt get_range_slice tatsächlich einen Bereich? Muss der Datentyp des Schlüssels nicht bekannt sein? Es gibt keine Deklaration des Datentyps des Schlüssels. In der Datei storage_conf.xml deklarieren Sie den Typ der Spalten, nicht jedoch der Schlüssel. Wird angenommen, dass der Schlüssel vom gleichen Typ wie die Spalten ist? Oder macht es etwas magisches Schnüffeln?

Ich habe auch Referenzimplementierungen gesehen, wo Menschen TimeUUIDType in Spalten speichern. Dies scheint jedoch Skalenprobleme zu haben, da dieser spezielle Schlüssel dann "heiß" wird, da jede Änderung ihn aktualisieren müsste.

Alle Zeiger in diesem Fall würden geschätzt werden.

Antwort

2

Beim Sortieren von Daten sind nur die Spaltenschlüssel wichtig. Die gespeicherten Daten haben keine Bedeutung, ebenso wenig wie der automatisch generierte Zeitstempel. Das CompareWith-Attribut ist hier wichtig. Wenn Sie CompareWith als UTF8Type festlegen, werden die Schlüssel als UTF8Types interpretiert. Wenn Sie CompareWith als TimeUUIDType festlegen, werden die Schlüssel automatisch als Zeitstempel interpretiert. Sie müssen den Datentyp nicht angeben. Sehen Sie sich die SlicePredicate- und SliceRange-Definitionen auf dieser Seite an. http://wiki.apache.org/cassandra/API Dies ist ein guter Ausgangspunkt. Vielleicht finden Sie diesen Artikel auch nützlich http://www.sodeso.nl/?p=80 Im dritten Teil oder so spricht er über Slice seine Anfragen und so weiter.

+0

Ich verstehe, dass Sie Spalte-Schlüssel für die Sortierung verwenden können. Wenn ich jedoch einen Zeitstempel Spalt für jedes Element in meiner Sammlung zu schreiben, würde ich immer wieder zu einer einzigen Spalte Familie schreiben, die einen Hot Spot schaffen würden. – Doug

+0

Ich habe Ihren Kommentar nicht verstanden. Könnten Sie das bitte näher ausführen? Was die Spalte-Schlüssel betroffen sind, Cassandra Auto sortiert die gesamte Spalte (supercolumn), basierend auf dem Schlüssel (oder ‚Namen‘ in Cassandra Konvention), sobald Sie es speichern. Auch, wenn Sie ein wenig mehr auf Ihren Anwendungsfall erarbeiten könnte, würde es helfen :) –

0

Doug,

zu einer einzigen Spalte Familie schreiben kann manchmal einen Hotspot erstellen, wenn Sie eine Order-Preserving Partitioner verwenden, aber nicht, wenn Sie die Standard-Zufalls Partitioner verwenden (es sei denn, eine Teilmenge der Benutzer erstellen erheblich mehr Daten als alle anderen Benutzer!).

Wenn Sie sortiert Ihre Zeilen nach Zeit (eine ordnungserhalt Partitioner verwenden), dann sind Sie wahrscheinlich sogar eher Hotspots zu erstellen, da Sie Zeilen aufeinanderfolgende Zugabe wird und ein einzelner Knoten wird für jeden Bereich von verantwortlich der Schlüsselraum.

0

Spalten und Schlüssel können von jedem Typ sein, da der Zeilenschlüssel nur die erste Spalte ist. Praktisch ist der Cluster ein ringförmiger Hash-Schlüsselring, und Schlüssel werden vom Partitionierer gehashed, um sich um den Cluster herum zu verteilen.

Hüten Sie sich davor, Datumsangaben als Zeilenschlüssel zu verwenden, da selbst die Randomisierung des standardmäßigen Zufallspartitioners begrenzt ist und Sie damit Ihre Daten überladen könnten.

Wenn sich dieses Datum ändert, müssten Sie die vorherige Zeile löschen, da Sie nur Einfügungen in C * vornehmen können.

Hier ist, was wir wissen:

  • Ein Stück Bereich eine Reihe von Säulen in einer Reihe mit einem Startwert und einem Endwert ist, wird diese meist für breite Reihen verwendet als Spalten geordnet. Bekannte Spaltennamen, die in der CF definiert sind, sind indiziert, so dass sie unter Angabe von Namen abgerufen werden können.
  • Ein Schlüssel Scheibe, ist ein Schlüssel mit dem in Scheiben geschnittenen Spaltenbereich zugeordnet ist, wie durch Cassandra
  • Das Äquivalent eines where-Klausel verwendet sekundäre Indizes zurückgegeben, können Sie es Ungleichungsoperatoren verwenden, jedoch muss es in mindestens eine gleich Klausel Ihre Aussage (siehe auch https://issues.apache.org/jira/browse/CASSANDRA-1599).
  • eine Schlüsselbereich zu verwenden ist mit einem zufälligen Partitionner wirkungslos wie der MD5-Hash Ihres Schlüssels nicht lexikalische Ordnung nicht halten.

Was möchten Sie verwenden eine Spalte Familie basierte Index eine breite Reihe mit: Composite (TimeUUID | UserID) Damit dies nicht heiß zu werden, fügen Sie einen ersten sinnvollen Schlüssel („Scherbe key“) das würde die Daten über Knoten wie den Benutzertyp oder die Region teilen. In Cassandra mehr Daten als nötig zu haben ist kein Problem, es ist wie es entworfen wurde, also was Sie sich fragen müssen ist "Was muss ich abfragen" und dann eine Spaltenfamilie dafür entwerfen, anstatt zu versuchen, zu passen alles in einem CF wie in einem RDBMS.