Schreibvorgänge

Auf dieser Seite werden die Typen von Schreibanfragen aufgeführt, die Sie an Bigtable senden können. Außerdem wird beschrieben, wann Sie diese verwenden sollten und wann nicht. Informationen zum Aggregieren von Daten in einer Zelle beim Schreiben finden Sie unter Werte beim Schreiben zusammenfassen.

Mit der Bigtable Data API und den Clientbibliotheken können Sie Daten programmatisch in Ihre Tabellen schreiben. Bigtable sendet für jeden Schreibvorgang eine Antwort oder Bestätigung zurück.

Jede Clientbibliothek bietet die Möglichkeit, die folgenden Schreibanfragetypen zu senden:

  • Einfache Schreibvorgänge
  • Erhöhungen und Ergänzungen
  • Bedingte Schreibvorgänge
  • Batchschreibvorgänge

Bigtable-Clientbibliotheken haben eine integrierte intelligente Wiederholungsfunktion für einfache Schreibvorgänge und Batchschreibvorgänge. Sie kommen also problemlos mit vorübergehenden Ausfällen zurecht. Wenn Ihre Anwendung beispielsweise versucht, Daten zu schreiben, und ein vorübergehender Ausfall oder ein Netzwerkproblem auftritt, wird der Versuch automatisch wiederholt, bis der Schreibvorgang durchgeführt wurde oder das Zeitlimit für Anfragen erreicht ist. Dieses Die Ausfallsicherheit funktioniert sowohl bei Single-Cluster-Instanzen als auch bei replizierten Instanzen, Single-Cluster- oder Multi-Cluster-Routing.

Für Batch- und Streaming-Schreibvorgänge können Sie den Bigtable Beam-Connector verwenden. Weitere Informationen finden Sie unter Batch-Schreibvorgänge.

Weitere Informationen zu Limits für Schreibanfragen finden Sie unter Kontingente und Limits.

Beispiele für Cloud Bigtable-Clientbibliotheken für die auf dieser Seite beschriebenen Schreibanfragen finden Sie unter Beispiele für Schreibanfragen.

Schreibvorgangstypen und ihre Verwendung

Alle Schreibanfragen umfassen die folgenden grundlegenden Komponenten:

  • Den Namen der Tabelle, in die Daten geschrieben werden sollen.
  • Eine App-Profil-ID, die Bigtable mitteilt, wie der Traffic weitergeleitet werden soll.
  • Eine oder mehrere Mutationen. Eine Mutation besteht aus den folgenden Elementen:
    • Name der Spaltenfamilie
    • Spaltenqualifizierer
    • Zeitstempel
    • Wert, den Sie in die Datenbank schreiben.

Der Zeitstempel einer Mutation hat den Standardwert „current date and time“ (aktuelles Datum und Uhrzeit), gemessen als seit der Unix-Epoche (00:00:00 UTC am 1. Januar 1970) vergangene Zeit.

Ein Zeitstempel, den Sie an Bigtable senden, muss ein Mikrosekundenwert sein und darf höchstens eine Genauigkeit im Millisekundenbereich haben. Ein Zeitstempel mit einer Genauigkeit bis auf Mikrosekunden wie 3023483279876543 wird abgelehnt. In diesem Beispiel ist der zulässige Zeitstempelwert 3023483279876000

Alle Mutationen in einem einzelne Schreibanfrage denselben Zeitstempel haben, es sei denn, Sie überschreiben sie. Sie können den Zeitstempel aller Mutationen in einer Schreibanfrage auf unterscheiden.

Einfache Schreibvorgänge

Sie können eine einzelne Zeile in Bigtable mit einer MutateRow-Anfrage schreiben, die den Tabellennamen, die ID des zu verwendenden Anwendungsprofils, einen Zeilenschlüssel und bis zu 100.000 Mutationen für diese Zeile enthält. Ein einzeiliger Schreibvorgang ist atomar. Verwenden Sie diesen Schreibvorgangstyp, wenn Sie mehrere Mutationen an einer einzelnen Zeile vornehmen.

Codebeispiele zum Senden einfacher Schreibanfragen finden Sie unter Einfache Schreibanfragen ausführen.

Wann einfache Schreibvorgänge nicht verwendet werden sollen

Für die folgenden Anwendungsfälle sind einfache Schreibvorgänge nicht die beste Möglichkeit, um Daten zu schreiben:

  • Sie schreiben einen Datenbatch mit zusammenhängenden Zeilenschlüsseln. In diesem Fall sollten Sie Batchschreibvorgänge anstelle von aufeinanderfolgenden einfachen Schreibvorgängen verwenden, da ein zusammenhängender Batch in einem einzelnen Back-End-Aufruf angewendet werden kann.

  • Sie möchten einen hohen Durchsatz (Zeilen pro Sekunde oder Byte pro Sekunde) und benötigen keine niedrige Latenz. In diesem Fall sind Batchschreibvorgänge schneller.

Erhöhungen und Ergänzungen

Wenn Sie einen Wert erhöhen oder erhöhen möchten, sollten Sie aggregates verwenden. aktualisieren Sie einen Wert zum Zeitpunkt des Schreibens, ist dies die beste Option. Für Aggregate werden keine Append-Vorgänge unterstützt. Weitere Informationen finden Sie unter Werte zum Schreibzeitpunkt aggregieren:

Wenn Sie einen vorhandenen Wert durch Daten ergänzen oder einen vorhandenen numerischen Wert erhöhen möchten und keine Aggregate verwenden können, können Sie eine ReadModifyWriteRow-Anfrage senden. Diese enthält den Tabellennamen, die ID des zu verwendenden App-Profils, einen Zeilenschlüssel und eine Reihe von Regeln, die beim Schreiben der Daten verwendet werden sollen. Jede Regel umfasst den Namen der Spaltenfamilie, den Spaltenqualifizierer, und entweder einen Anfügewert oder einen inkrementellen Wert.

Regeln werden der Reihe nach angewendet. Wenn Ihre Anfrage beispielsweise eine Anfrage zum Erhöhen des Werts für eine Spalte um zwei enthält und eine spätere Regel in derselben Anfrage dieselbe Spalte um 1 erhöht, wird die Spalte in diesem einzelnen atomaren Schreibvorgang um 3 erhöht. Die spätere Regel überschreibt nicht die frühere Regel.

Ein Wert kann nur erhöht werden, wenn er als 64-Bit-Big-Endian-Ganzzahl codiert ist. Bigtable behandelt eine Erhöhung auf einen leeren oder nicht vorhandenen Wert wie einen Wert, der null ist. ReadModifyWriteRow-Anfragen sind atomar. Sie werden nicht wiederholt, wenn sie aus irgendeinem Grund fehlschlagen.

Codebeispiele zum Anhängen eines Werts in einer Zelle finden Sie unter Vorhandenen Wert erhöhen.

Fälle, in denen ReadModifyWriteRow nicht geeignet ist

Sende in den folgenden Situationen keine ReadModifyWriteRow-Anfragen:

  • Ihr Anwendungsfall kann mit Aggregationen verarbeitet werden.

  • Sie verwenden ein Anwendungsprofil mit Multi-Cluster-Routing.

  • Sie verwenden mehrere Single-Cluster-App-Profile und senden Schreibvorgänge, die mit Daten in Konflikt stehen können, die in derselben Zeile und Spalte in anderen Clustern in der Instanz geschrieben wurden. Beim Single-Cluster-Routing wird eine Schreibanfrage an einen einzelnen Cluster gesendet und anschließend repliziert.

  • Sie nutzen die intelligente Wiederholungsfunktion, die von den Clientbibliotheken bereitgestellt wird. Erhöhungen und Ergänzungen können nicht noch einmal versucht werden.

  • Sie schreiben große Datenmengen und müssen die Schreibvorgänge schnell beenden. Eine Anfrage, die eine Zeile liest und dann ändert, ist langsamer als eine einfache Schreibanfrage. Dieser Schreibvorgangstyp ist daher bei umfangreichen Projekten oft nicht der beste Ansatz.

    Wenn Sie beispielsweise etwas in Millionenhöhe zählen möchten, wie Seitenaufrufe, sollten Sie Summen verwenden, um die Anzahl beim Schreiben zu aktualisieren. Ich jeden Aufruf auch als einfachen Schreibvorgang aufzeichnen, einen Wert erhöhen und dann mit einem Dataflow-Job Daten.

Bedingte Schreibvorgänge

Wenn Sie eine Zeile auf eine Bedingung prüfen und dann je nach Ergebnis Daten in diese Zeile schreiben möchten, senden Sie eine CheckAndMutateRow-Anfrage. Dieser Anfragetyp umfasst einen Zeilenschlüssel und einen Zeilenfilter. Ein Zeilenfilter besteht aus einer Reihe von Regeln, mit denen Sie den Wert vorhandener Daten prüfen. Danach werden Mutationen nur dann bestimmten Spalten in der Zeile zugewiesen, wenn bestimmte Bedingungen erfüllt sind, die vom Filter überprüft wurden. Das Überprüfen und anschließende Schreiben wird als einzelne atomare Aktion abgeschlossen.

Eine Filteranfrage muss einen oder beide der folgenden Mutationstypen enthalten:

  • "Wahre" Mutationen oder die Mutationen, die angewendet werden müssen, wenn der Filter einen Wert zurückgibt
  • "Falsche" Mutationen, die angewendet werden, wenn der Filter keine Ergebnisse liefert

Sie können bis zu 100.000 Mutationen jedes Typs (wahr und falsch) in einem einzigen Schreibvorgang bereitstellen und Sie müssen mindestens einen davon senden. Bigtable sendet eine Antwort, wenn alle Mutationen abgeschlossen sind.

Codebeispiele zum Senden von bedingten Schreibvorgängen finden Sie unter Wert bedingt schreiben.

Wann bedingte Schreibvorgänge nicht verwendet werden sollen

Für den folgenden Anwendungsfall können Sie keine bedingten Schreibvorgänge verwenden:

  • Sie verwenden ein Anwendungsprofil mit Multi-Cluster-Routing.

  • Sie verwenden mehrere Single-Cluster-App-Profile und senden Schreibvorgänge, die mit Daten in Konflikt stehen können, die in derselben Zeile und Spalte in anderen Clustern in der Instanz geschrieben wurden. Beim Single-Cluster-Routing wird eine Schreibanfrage an einen einzelnen Cluster gesendet und anschließend repliziert.

  • Sie schreiben große Datenmengen und müssen die Schreibvorgänge schnell beenden. Ähnlich wie bei ReadModifyWriteRow müssen bedingte Schreibanfragen Zeilen vor dem Ändern lesen, sodass CheckAndModifyRow-Anfragen langsamer sind als einfache Schreibanfragen erstellen. Dieser Schreibvorgangstyp ist daher bei umfangreichen Projekten oft nicht der beste Ansatz.

Batchschreibvorgänge

Mit einer MutateRows-Anfrage können Sie mit einem Aufruf mehr als eine Zeile schreiben. MutateRows-Anfragen enthalten einen Satz von bis zu 100.000 Einträgen, die jeweils atomar angewendet werden. Jeder Eintrag besteht aus einem Zeilenschlüssel und mindestens einer Mutation, die auf die Zeile angewendet werden soll. Eine Batchschreibanfrage kann bis zu 100.000 Mutationen enthalten, die auf alle Einträge verteilt sind. Ein Batchschreibvorgang könnte beispielsweise eine der folgenden Varianten enthalten:

  • 100.000 Einträge mit 1 Mutation in jedem Eintrag
  • 1 Eintrag mit 100.000 Mutationen
  • 1.000 Einträge mit jeweils 100 Mutationen

Jeder Eintrag in einer MutateRows-Anfrage ist atomar, die Anfrage insgesamt jedoch nicht. Bei Bedarf wiederholt Bigtable alle Einträge im Batch, die nicht erfolgreich sind, bis alle Schreibvorgänge erfolgreich sind oder das Zeitlimit für Anfragen erreicht ist. Dann wird eine Antwort zurückgegeben, die jeden Schreibvorgang im Stapel identifiziert und angibt, ob der Schreibvorgang erfolgreich war oder nicht.

Codebeispiele zum Senden von Batchschreibvorgängen finden Sie unter Batchschreibvorgänge ausführen.

Wann keine Batchschreibvorgänge verwendet werden sollen

  • Sie schreiben Bulk-Daten in Zeilen, die nicht nahe beieinander liegen. Bigtable speichert Daten lexikografisch nach Zeilenschlüssel, dem binären Äquivalent der alphabetischen Reihenfolge. Aus diesem Grund werden unterschiedliche Zeilenschlüssel in einer Anfrage von Bigtable nacheinander und nicht parallel verarbeitet. Sowohl der Durchsatz als auch die Latenz werden hoch sein. Verwenden Sie MutateRows, wenn die Zeilenschlüssel ähnlich sind und Bigtable Zeilen schreibt, die nahe beieinander liegen, um diese hohe Latenz zu vermeiden. Verwenden Sie MutateRow oder einfache Schreibvorgänge für Zeilen, die nicht nah beieinander liegen.

  • Sie fordern mehrere Mutationen in derselben Zeile an. In diesem Fall ist die Leistung besser, wenn Sie alle Mutationen in einer einzelnen einfachen Schreibanfrage ausführen. Dies liegt daran, dass bei einem einfachen Schreibvorgang alle Änderungen in einer einzigen atomaren Aktion durchgeführt werden, während beim Batchschreibvorgang Mutationen in dieselbe Zeile serialisiert werden, was Latenz verursacht.

Ablaufsteuerung für Batch-Schreibvorgänge

Wenn Sie Ihre Batch-Schreibvorgänge mit einer der folgenden Methoden senden, können Sie in Ihrem Code die Batch-Schreibflusssteuerung aktivieren.

Wenn die Batch-Ablaufsteuerung für einen Dataflow-Job aktiviert ist, Bigtable führt automatisch folgende Schritte aus :

  • Traffic begrenzen, um eine Überlastung Ihres Bigtable-Clusters zu vermeiden
  • Sorgt dafür, dass der Cluster ausreichend ausgelastet ist, um das Bigtable-Autoscaling (falls aktiviert) auszulösen, sodass bei Bedarf automatisch weitere Knoten hinzugefügt werden

Diese kombinierten Aktionen verhindern eine Clusterüberlastung und Jobfehler und Sie vermeiden Ihren Cluster manuell skalieren müssen, bevor der Batch-Schreibvorgang ausgeführt wird. Wenn die Ablaufsteuerung aktiviert ist, erfolgt die Clusterskalierung während des Dataflow-Job statt vorher, sodass es länger dauern kann, als wenn Sie den Cluster manuell skalieren.

Sie müssen ein Anwendungsprofil verwenden, das für Single-Cluster-Routing konfiguriert ist. Das Aktivieren des Bigtable-Autoscalings für den Zielcluster ist keine Voraussetzung. Mit dem Autoscaling können Sie jedoch die Batch-Schreibvorgänge optimal steuern. Sie können das Dataflow-Autoscaling genauso wie bei jedem anderen Job verwenden.

Weitere Informationen zu Bigtable-Autoscaling finden Sie unter Autoscaling. Informationen zu Routingrichtlinien für Anwendungsprofile finden Sie unter Anwendungsprofile – Übersicht.

Ein Codebeispiel zum Aktivieren der Ablaufsteuerung für Batch-Schreibvorgänge mit dem Bigtable HBase Beam-Connector finden Sie unter In Bigtable schreiben.

Daten in eine autorisierte Ansicht schreiben

Wenn Sie Daten in eine autorisierte Ansicht schreiben möchten, müssen Sie eine der folgenden Methoden verwenden:

  • gcloud-CLI
  • Bigtable-Client für Java

Die anderen Bigtable-Clientbibliotheken bieten noch keine Unterstützung für autorisierten Ansichtszugriff.

Wenn Sie Daten in eine autorisierte Ansicht schreiben, geben Sie die Methode die ID der autorisierten Ansicht.

Alle Schreibvorgänge in einer autorisierten Ansicht werden direkt auf die zugrunde liegende Tabelle angewendet.

Einschränkungen für die Definition autorisierter Ansichten

In einer autorisierten Ansicht die Zeilen oder Spalten, in die Sie Daten schreiben können durch die Definition der autorisierten Ansicht eingeschränkt sind. Mit anderen Worten: Sie können nur in Zeilen und Spalten schreiben, die denselben Kriterien entsprechen, die für die autorisierte Ansicht festgelegt wurden.

Wenn die autorisierte Ansicht beispielsweise durch das Präfix examplepetstore1 des Zeilenschlüssels definiert ist, können Sie keine Daten mit einem Zeilenschlüssel von examplepetstore2 schreiben. Der Anfang des Zeilenschlüsselwerts muss den gesamten String examplepetstore1 enthalten.

Wenn die autorisierte Ansicht durch den Spaltenqualifizierer definiert wird, order-phone vorangestellt ist, können Sie Daten mit dem Spaltenqualifizierer schreiben order-phone123. Der Spaltenqualifizierer order-tablet kann jedoch nicht verwendet werden.

Ihre Schreibanfrage kann auch nicht auf Daten verweisen, die sich außerhalb des z. B. wenn Sie nach einem Wert in einem bedingte Schreibanfrage.

Bei jeder Anfrage, bei der Daten außerhalb der autorisierten Ansicht geschrieben oder darauf verwiesen werden, wird die Fehlermeldung PERMISSION_DENIED zurückgegeben.

Replikation

Wenn ein Cluster einer replizierten Instanz einen Schreibvorgang empfängt, wird dieser Schreibvorgang sofort auf die anderen Cluster in der Instanz repliziert.

Atomarität

Für jede MutateRows-Anfrage, die Sie an eine replizierte Instanz senden, wird ein Commit durchgeführt als einzelne atomare Aktion im Cluster, an den die Anfrage weitergeleitet wird. Wenn der Parameter auf die anderen Cluster in der Instanz repliziert wird, erhalten alle den Schreibvorgang als atomaren Vorgang. Cluster erhalten keine Teillieferung mutations; eine Mutation entweder erfolgreich oder atomar für alle Zellen fehlschlägt die es verändert.

Konsistenz

Wie lange es dauert, bis die von Ihnen geschriebenen Daten für Lesevorgänge zur Verfügung stehen, hängt von mehreren Faktoren ab, einschließlich der Anzahl der Cluster in Ihrer Instanz und des Routing-Typs, den Ihr App-Profil verwendet.

Mit einer Single-Cluster-Instanz können die Daten sofort gelesen werden, aber wenn ein Instanz mehr als einen Cluster hat, d. h., sie verwendet Replikation, Bigtable ist Eventual Consistency. Sie können Read-Your-Writes-Konsistenz erreichen, indem Sie Anfragen an denselben Cluster weiterleiten.

Sie können ein Konsistenztoken erstellen und verwenden und CheckConsistency im StandardReadRemoteWrites-Modus aufrufen, nachdem Sie Schreibanfragen gesendet haben. Das Token prüft die Replikationskonsistenz. In der Regel erstellen Sie ein Konsistenztoken entweder nach dem Senden eines Batches von Schreibvorgängen oder nach einem bestimmten Intervall, z. B. nach einer Stunde. Anschließend können Sie das zu verwendende Token durch einen anderen Prozess übergeben, z. B. ein Modul, das eine Leseanfrage stellt. Dabei wird mithilfe des Tokens überprüft, ob alle Daten repliziert wurden, bevor versucht wird, sie zu lesen.

Wenn Sie ein Token direkt nach dem Erstellen verwenden, kann es einige Minuten dauern, bis die Konsistenz bei der ersten Verwendung überprüft wurde. Diese Verzögerung liegt daran, dass jeder Cluster jeden anderen Cluster überprüft, um sicherzustellen, dass keine Daten mehr eingehen. Nach der erstmaligen Verwendung oder wenn Sie einige Minuten auf die erstmalige Verwendung des Tokens warten, ist das Token bei jeder Verwendung sofort erfolgreich.

Konfliktlösung

Jeder Zellenwert in einer Bigtable-Tabelle wird durch das Vierertupel (Zeilenschlüssel, Spaltenfamilie, Spaltenqualifizierer, Zeitstempel) eindeutig identifiziert. Weitere Informationen zu diesen Kennzeichnungen finden Sie unter Bigtable-Speichermodell. In dem seltenen Fall, dass zwei Schreibvorgänge mit demselben identischen Vierertupel an zwei verschiedene Cluster gesendet werden, löst Bigtable den Konflikt automatisch mithilfe eines internen Algorithmus des Typs last write wins auf Grundlage der serverseitigen Zeit auf. Die Bigtable-Implementierung "Last write Wins" (Zeitpunkte des letzten Schreibvorgangs) ist deterministisch. Wenn die Replikation aufholt, haben alle Cluster denselben Wert für das Vierertupel.

Nächste Schritte