2016-08-09 51 views
0

Ich habe eine Python-Anwendung, mit Flask gebaut, die den Import von vielen Datensätzen ermöglicht (irgendwo von 10k-250k + Datensätze auf einmal). Im Moment fügt sie in eine Datenbank Cassandra, durch Einfügen von einem Datensatz zu einem Zeitpunkt wie folgt aus:Wie Sie mit Python Bulk-Daten effizient in Cassandra einfügen?

for transaction in transactions: 
    self.transaction_table.insert_record(transaction) 

Dieser Prozess unglaublich langsam ist. Gibt es einen Best-Practice-Ansatz, den ich verwenden könnte, um diese Massendaten effizienter einzufügen?

+1

Die offensichtliche Sache wäre, versuchen Massen einfügen Fragen, die Cassandra unterstützt. Auch die Vorbereitung einer Abfrage und deren Wiederverwendung könnte tatsächlich schneller sein als Bulk-Inserts. Aber erwarte nicht, dass 250k-Datensätze schnell importiert werden. Vielleicht sollten Sie den Job an Mitarbeiter delegieren? – freakish

Antwort

1

Sie können dafür Batch-Anweisungen verwenden. Ein Beispiel und Dokumentation finden Sie unter datastax documentation. Sie können auch einige Kinderarbeiter und/oder asynchrone Abfragen verwenden.

In Bezug auf Best Practices ist es effizienter, wenn jeder Stapel nur einen Partitionsschlüssel enthält. Das liegt daran, dass ein Knoten nicht als Koordinator für viele verschiedene Partitionsschlüssel verwendet werden soll. Es wäre daher schneller, jeden einzelnen Knoten direkt zu kontaktieren.

Wenn jeder Datensatz einen anderen Partitionsschlüssel hat, kann eine einzelne vorbereitete Anweisung mit einigen untergeordneten Arbeitern besser funktionieren.

Sie können auch die Verwendung einer TokenAware load balancing policy in Betracht ziehen, die es ermöglicht, den entsprechenden Knoten direkt zu kontaktieren, anstatt über einen anderen Knoten koordiniert zu werden.

1

Die einfachste Lösung besteht darin, csv-Dateien aus Ihren Daten zu generieren und sie mit dem Befehl COPY zu importieren. Das sollte gut für bis zu ein paar Millionen Zeilen funktionieren. Für kompliziertere Szenarien können Sie den Befehl sstableloader verwenden.