Diese Seite enthält Richtlinien für das effiziente Laden großer Datenmengen im Bulk in Spanner importieren.
Sie haben mehrere Möglichkeiten, Daten im Bulk in Spanner zu laden:
- Zeilen mithilfe der Datenbearbeitungssprache (DML) einfügen
- Fügen Sie Zeilen mithilfe von Mutationen ein.
- Daten mit dem Dataflow-Connector importieren
- Datenbank mit Avro-Dateien importieren
- Daten im CSV-Format importieren
Sie können zwar auch Zeilen mithilfe der Google Cloud CLI einfügen, empfehlen wir, die gcloud CLI nicht für Bulk-Ladevorgänge zu verwenden.
Leistungsrichtlinien für das Laden im Bulk
Maximieren Sie die Partitionierung, um eine optimale Leistung beim Laden im Bulk zu erreichen um das Schreiben der Daten auf Worker-Aufgaben zu verteilen.
Spanner verwendet eine lastbasierte Aufteilung, um Ihre Daten gleichmäßig zu verteilen der Rechenressourcen der Instanz. Nach einigen Minuten hoher Last führt Spanner zwischen Zeilen aufzuteilen. Der Durchsatz sollte sich für Schreibvorgänge alle paar Minuten verdoppeln, wenn die Datenlast gut verteilt ist und Sie die Best Practices für das Schemadesign und das Laden im Bulk befolgen, bis die verfügbaren CPU-Ressourcen in Ihrer Instanz belegt sind.
Daten nach Primärschlüssel partitionieren
Spanner partitioniert Tabellen dynamisch in kleinere Bereiche. Die primäre für eine Zeile bestimmt, wo sie partitioniert wird.
Partitionieren Sie die Daten mit dem folgenden Muster nach dem Primärschlüssel, um einen optimalen Schreibdurchsatz für das Laden im Bulk zu erhalten:
- Jede Partition enthält abhängig von den Schlüsselspalten einen Bereich von aufeinanderfolgenden Zeilen.
- Jeder Commit enthält nur Daten für eine einzige Partition.
Es empfiehlt sich, die Anzahl der Partitionen auf das 10-Fache der Anzahl der Knoten in Ihrer Spanner-Instanz. So weisen Sie Partitionen Zeilen zu:
- Filtern Sie die Daten nach Primärschlüssel.
- Teilen Sie die Daten in 10 * (Anzahl Knoten) getrennte Partitionen gleicher Größe auf.
- Erstellen Sie für jede Partition eine eigene Worker-Aufgabe und weisen Sie diese zu. Die Worker-Aufgaben werden in Ihrer Anwendung erstellt. Dies ist keine Spanner-Funktion.
Nach diesem Muster ergibt sich normalerweise ein Gesamtdurchsatz von 10–20 MB pro Sekunde und Knoten für den Bulk-Schreibvorgang.
Beim Laden von Daten erstellt und aktualisiert Spanner Splits, um den die Knoten in Ihrer Instanz zu belasten. Bei diesem Vorgang kann es zu einem vorübergehenden Rückgang des Durchsatzes kommen.
Beispiel
Eine regionale Konfiguration hat 3 Knoten. Es sind 90.000 Zeilen in einer nicht verschränkten Tabelle enthalten. Die Primärschlüssel in der Tabelle reichen von 1 bis 90.000.
- Zeilen: 90.000 Zeilen
- Knoten: 3
- Partitionen: 10 * 3 = 30
- Zeilen pro Partition: 90.000 / 30 = 3.000
Die erste Partition umfasst den Schlüsselbereich 1 bis 3.000. Die zweite Partition umfasst den Schlüsselbereich 3.001 bis 6.000. Die 30. Partition umfasst den Schlüsselbereich 87.001 bis 90.000. (Sie sollten in einer großen Tabelle keine sequentiellen Schlüssel verwenden. Dieses Beispiel dient nur zur Veranschaulichung.)
Jede Worker-Aufgabe sendet die Schreibvorgänge für eine einzelne Partition. Innerhalb jeder Partition sollten Sie die Zeilen nach Primärschlüssel schreiben. Auch bei zufälligen Schreibvorgängen in Bezug auf den Primärschlüssel ergibt sich so ein angemessen hoher Durchsatz. Über Testläufe erfahren Sie, welcher Ansatz die beste Leistung für Ihr Dataset bietet.
Wenn Sie keine Partitionen verwenden wollen
Das Schreiben zufälliger Zeilen innerhalb eines Commits kann länger dauern als das Schreiben eines einen zusammenhängenden Satz von Zeilen in einem Commit, und wahrscheinlich Daten in unterschiedlichen Partitionen. Die Commit-Latenz und der Overhead sind höher, wenn mehr Splits ausgeführt werden in ein Commit geschrieben, da die Serverkoordination erhöht wird. Mehrere Teilungen wahrscheinlich beteiligt sind, da jede zufällig ausgewählte Zeile zu einem anderen Split gehören kann. Im schlimmsten Fall Szenario, umfasst jeder Schreibvorgang jeden Split in Ihrer Spanner-Instanz. Als der Schreibdurchsatz sinkt, wenn mehr Splits erforderlich sind.
Bulk-Ladevorgang ohne Partitionierung
Das Schreiben eines zusammenhängenden Satzes von Zeilen in einen Commit kann schneller sein als das Schreiben von Zufallswerten Zeilen. Zufällige Zeilen enthalten wahrscheinlich auch Daten aus verschiedenen Partitionen.
Wenn mehr Partitionen in einen Commit geschrieben werden, erforderlich sind, was die Commit-Latenz und den Overhead erhöht.
Wahrscheinlich sind mehrere Partitionen beteiligt, da jede zufällig ausgewählte Zeile dazugehören könnte in eine andere Partition verschieben. Im schlimmsten Fall umfasst jeder Schreibvorgang jede Partition in Ihrer Spanner-Instanz. Wie oben erwähnt, schreiben Sie Der Durchsatz sinkt, wenn mehr Partitionen beteiligt sind.
Überlastung vermeiden
Es ist möglich, mehr Schreibanfragen zu senden, als Spanner verarbeiten kann. Spanner verarbeitet die Überlast, indem es Transaktionen abbricht, was als Ablehnung. Bei schreibgeschützten Transaktionen wiederholt Spanner automatisch Transaktion. In diesen Fällen hat der Pushback eine hohe Latenz. Bei hohen Lasten kann der Pushback bis zu einer Minute dauern. Bei sehr großer Last kann der Pushback mehrere Minuten dauern. Sie können einen Pushback vermeiden, indem Sie die Schreibanfragen drosseln, um die CPU-Auslastung in einem angemessenen Grenzwert zu halten. Alternativ können Nutzer:innen die Anzahl der Knoten erhöhen, damit die CPU-Auslastung innerhalb der Limits bleibt.
Commit von Mutationen mit 1 MB bis 5 MB gleichzeitig
Jeder Schreibvorgang in Spanner ist mit Aufwand verbunden, unabhängig davon, ob der Schreibvorgang groß ist oder klein ist. Maximieren Sie die Datenmenge, die pro Schreibvorgang gespeichert wird, um den Durchsatz zu maximieren. Größere Schreibvorgänge senken den Aufwand pro Schreibvorgang. Es empfiehlt sich, für jeden Commit eine Mutation für Hunderte von Zeilen auszuführen. Wenn relativ große Zeilen geschrieben werden, bietet eine Commit-Größe von 1 MB bis 5 MB normalerweise die beste Leistung. Wenn Sie kleine oder indexierte Werte schreiben, sollten Sie in der Regel höchstens einige hundert Zeilen in einem einzigen Commit schreiben. Unabhängig von der Commit-Größe und der Anzahl der Zeilen ist eine Beschränkung auf 80.000 Mutationen pro Commit Sie sollten den Durchsatz testen und messen, um die optimale Leistung zu ermitteln.
Bei Commits, die größer als 5 MB oder mehr als ein paar hundert Zeilen sind, bieten zusätzlichen Nutzen und riskieren, die Spanner-Limits zu überschreiten Commit-Größe und Mutationen pro Commit.
Richtlinien für sekundäre Indexe
Wenn Ihre Datenbank über sekundäre Indexe verfügt, müssen Sie wählen, ob Sie die Indexe vor oder nach dem Laden der Tabellendaten dem Datenbankschema hinzufügen.
Wenn Sie den Index vor dem Laden der Daten hinzufügen, kann die Schemaänderung sofort abgeschlossen werden. Allerdings dauert jeder Schreibvorgang, der sich auf den Index auswirkt, länger, da auch der Index aktualisiert werden muss. Wenn der Datenladevorgang abgeschlossen ist, kann die Datenbank sofort mit allen vorhandenen Indexen verwendet werden. Um eine Tabelle und ihre senden Sie die DDL-Anweisungen für die neue Tabelle und neue Indexe in einer einzelnen Anfrage an Spanner senden.
Wenn Sie den Index nach dem Laden der Daten hinzufügen, ist jeder Schreibvorgang effizient. Die Schemaänderung für jeden Index-Backfill kann jedoch lange dauern. Die Datenbank ist nicht vollständig nutzbar und Abfragen können die Indexe erst verwenden, wenn alle Schemaänderungen abgeschlossen sind. Die Datenbank kann weiterhin Schreibvorgänge bereitstellen. und Suchanfragen, allerdings langsamer.
Wir empfehlen, Indexe hinzuzufügen, die für Ihre Geschäftsanwendung wichtig sind bevor Sie die Daten laden. Für alle nicht kritischen Indexe fügen Sie sie nach dem Daten migriert werden.
Durchsatz testen und messen
Es kann schwierig sein, den Durchsatz vorherzusagen. Sie sollten Ihre Strategie testen, Daten im Bulk zu laden, bevor Sie dies tatsächlich ausführen. Ein ausführliches Beispiel für die Partitionierung und Überwachung von Leistung finden Sie unter Durchsatz für die Datenlast maximieren.
Best Practices für das periodische Laden im Bulk in eine vorhandene Datenbank
Wenn Sie eine vorhandene Datenbank aktualisieren, die Daten enthält, jedoch keine sekundären Indexe hat, gelten weiterhin die Empfehlungen in diesem Thema.
Bei sekundären Indexen hilft Ihnen diese Anleitung wahrscheinlich gut weiter. Die Leistung hängt davon ab, wie viele Splits im Durchschnitt an Ihren Transaktionen beteiligt sind. Wenn der Durchsatz zu niedrig ausfällt, können Sie Folgendes versuchen:
- Fügen Sie eine geringere Anzahl von Mutationen in jeden Commit ein. Das kann den Durchsatz erhöhen.
- Wenn Ihr Upload die aktuelle Gesamtgröße der zu aktualisierenden Tabelle überschreitet, löschen Sie die sekundären Indexe und fügen Sie sie nach dem Hochladen der Daten neu hinzu. Dieser Schritt ist normalerweise nicht erforderlich, kann jedoch den Durchsatz verbessern.