Lesevorgänge
Auf dieser Seite werden die Arten von Leseanfragen beschrieben, die Sie an Bigtable senden können. Außerdem werden Auswirkungen auf die Leistung erörtert und einige Empfehlungen für bestimmte Arten von Abfragen gegeben. Bevor Sie diese Seite lesen, sollten Sie sich mit den Informationen unter Übersicht über Bigtable vertraut machen.
Übersicht
Leseanfragen an Bigtable geben den Inhalt der angeforderten Zeilen in Schlüsselreihenfolge zurück, also in der Reihenfolge, in der sie gespeichert sind. Alle Schreibvorgänge, die eine Antwort zurückgegeben haben, können gelesen werden.
Die von der Tabelle unterstützten Abfragen sollten dabei helfen, den für Ihren Anwendungsfall am besten geeigneten Lesetyp zu bestimmen. Bigtable-Leseanfragen fallen in zwei allgemeine Kategorien:
- Einzelne Zeile lesen
- Scans oder Lesen mehrerer Zeilen
Lesevorgänge sind auf Zeilenebene atomar. Wenn Sie also eine Leseanfrage für eine Zeile senden, gibt Bigtable entweder die gesamte Zeile zurück oder im Falle einer fehlgeschlagenen Anfrage nichts aus der Zeile. Eine Teilzeile wird nie zurückgegeben, es sei denn, Sie fordern eine solche an.
Wir empfehlen Ihnen dringend, unsere Cloud Bigtable-Clientbibliotheken zum Lesen von Daten aus einer Tabelle zu verwenden und nicht die API direkt aufzurufen. Codebeispiele, die das Senden von Leseanfragen zeigen, sind in mehreren Sprachen verfügbar. Alle Leseanfragen führen den API-Aufruf ReadRows
aus.
Daten mit serverlosem Computing von Data Boost lesen
Mit Bigtable Data Boost können Sie Lesejobs und Abfragen im Batch ausführen, ohne den täglichen Anwendungstraffic zu beeinträchtigen. Data Boost ist ein serverloser Computing-Dienst, mit dem Sie Ihre Bigtable-Daten lesen können, während Ihre Hauptanwendung die Knoten Ihres Clusters für die Datenverarbeitung verwendet.
Data Boost eignet sich ideal für Scans und wird nicht für Lesezugriffe auf einzelne Zeilen empfohlen. Sie können Data Boost nicht für umgekehrte Suchanfragen verwenden. Weitere Informationen und Teilnahmevoraussetzungen finden Sie in der Übersicht über Data Boost.
Einzeilige Lesevorgänge
Sie können eine einzelne Zeile anhand des Zeilenschlüssels anfordern. Einzeilige Lesevorgänge, auch Punktlesevorgänge genannt, sind mit Data Boost nicht kompatibel. Codebeispiele sind für die folgenden Varianten verfügbar:
Scans
Scans sind die gängigste Methode, um Daten aus Bigtable zu lesen. Wenn Sie einen Bereich von zusammenhängenden Zeilen oder mehrere Bereiche von Zeilen aus Bigtable lesen möchten, können Sie ein Zeilenschlüsselpräfix oder Start- und Endzeilenschlüssel angeben. Codebeispiele sind für die folgenden Varianten verfügbar:
- Bereich von Zeilen lesen
- Mehrere Bereiche von Zeilen lesen
- Mehrere Zeilen mithilfe eines Schlüsselpräfixes lesen
Reverse-Scans
Mit Rückwärtsabfragen können Sie einen Zeilenbereich rückwärts lesen, indem Sie entweder ein Zeilenschlüsselpräfix oder einen Zeilenbereich angeben. Das Präfix des Zeilenschlüssels wird als Ausgangspunkt für das Rückwärtslesen verwendet. Wenn Sie einen Zeilenbereich angeben, wird der Schlüssel der Endzeile als Ausgangspunkt für den Scan verwendet.
Das Scannen in umgekehrter Reihenfolge kann in folgenden Fällen nützlich sein:
- Sie möchten ein Ereignis (Zeile) finden und dann die vorherigen N Ereignisse lesen.
- Sie möchten den höchsten Wert vor einem bestimmten Wert ermitteln. Das kann hilfreich sein, wenn Sie Zeitreihendaten mit einem Zeitstempel als Zeilenschlüsselsuffix speichern.
Rückwärtsscans sind weniger effizient als Vorwärtsscans. Im Allgemeinen sollten Sie Ihre Zeilenschlüssel so gestalten, dass die meisten Scans vorwärts erfolgen. Verwenden Sie Rückwärtssuchen für kurze Suchanfragen, z. B. mit maximal 50 Zeilen, um eine geringe Latenz bei der Antwortzeit zu erreichen.
Wenn Sie in umgekehrter Reihenfolge scannen möchten, setzen Sie den Wert für das Feld ReadRowsRequest
auf „true“.reversed
Der Standardwert lautet „falsch“.
Rückwärtssuchen sind mit den folgenden Clientbibliotheken verfügbar:
- Bigtable-Clientbibliothek für C++ Version 2.18.0 oder höher
- Bigtable-Clientbibliothek für Go Version 1.21.0 oder höher
- Bigtable-Clientbibliothek für Java Version 2.24.1 oder höher
- Bigtable HBase-Client für Java, Version 2.10.0 oder höher
Codebeispiele zur Verwendung von Rückwärtsab scans finden Sie unter Rückwärts scannen.
Anwendungsbeispiele
In den folgenden Beispielen wird gezeigt, wie Sie mit Rückwärtssuchen herausfinden können, wann ein Kunde sein Passwort zuletzt geändert hat, und wie sich die Preise für ein Produkt an einem bestimmten Tag entwickelt haben.
Passwort zurücksetzen
Angenommen, Ihre Zeilenschlüssel enthalten jeweils eine Kundennummer und ein Datum im Format 123ABC#2022-05-02
. Eine der Spalten ist password_reset
, in der die Stunde gespeichert ist, zu der das Passwort zurückgesetzt wurde.
Bigtable speichert die Daten automatisch lexikografisch, wie im Folgenden dargestellt. Für Zeilen (Tage), an denen das Passwort nicht zurückgesetzt wurde, ist diese Spalte nicht vorhanden.
`123ABC#2022-02-12,password_reset:03`
`123ABC#2022-04-02,password_reset:11`
`123ABC#2022-04-14`
`123ABC#2022-05-02`
`223ABC#2022-05-22`
Wenn Sie herausfinden möchten, wann der Kunde 123ABC
sein Passwort zuletzt zurückgesetzt hat, können Sie einen Bereich von 123ABC#
bis 123ABC#<DATE>
in umgekehrter Reihenfolge mit dem heutigen Datum oder einem Datum in der Zukunft für alle Zeilen mit der Spalte password_reset
mit einem Zeilenlimit von 1 durchsuchen.
Preisänderungen
In diesem Beispiel enthalten die Zeilenschlüssel Werte für Produkt, Modell und Zeitstempel. Eine der Spalten enthält den Preis für das Produkt und das Modell zu einem bestimmten Zeitpunkt.
`productA#model2#1675604471,price:82.63`
`productA#model2#1676219411,price:82.97`
`productA#model2#1677681011,price:83.15`
`productA#model2#1680786011,price:83.99`
`productA#model2#1682452238,price:83.12`
Wenn Sie Preisschwankungen um den Preis am 14. Februar 2023 ermitteln möchten, obwohl in der Tabelle kein Zeilenschlüssel für dieses Datum vorhanden ist, können Sie einen Vorwärtsscan ab dem Zeilenschlüssel productA#model2#1676376000
für N Zeilen und dann einen Rückwärtsscan für dieselbe Anzahl von Zeilen ab derselben Startzeile ausführen. Die beiden Scans geben Ihnen die Preise vor und nach dem angegebenen Zeitpunkt an.
Gefilterte Lesevorgänge
Wenn Sie nur Zeilen mit bestimmten Werten oder Teilzeilen benötigen, können Sie einen Filter in der Leseanfrage verwenden. Filter ermöglichen eine äußerst selektive Auswahl von Daten.
Mit Filtern können Sie außerdem gewährleisten, dass Lesevorgänge den von der Tabelle verwendeten Richtlinien für die automatische Speicherbereinigung entsprechen. Dies ist besonders nützlich, wenn Sie häufig neue Zellen mit Zeitstempeln in vorhandene Spalten schreiben. Da es bei der automatischen Speicherbereinigung bis zu einer Woche dauern kann, bis abgelaufene Daten entfernt sind, können Sie durch Verwenden eines Zeitstempelbereichs-Filters beim Lesen von Daten dafür sorgen, dass nicht mehr Daten als benötigt gelesen lesen.
In der Filterübersicht finden Sie ausführliche Erläuterungen der Filtertypen, die Sie verwenden können. Unter Filter verwenden werden Beispiele in mehreren Sprachen gezeigt.
Daten aus einer autorisierten Ansicht lesen
Um Daten aus einer autorisierten Datenansicht zu lesen, müssen Sie eine der folgenden Methoden verwenden:
- gcloud-CLI
- Bigtable-Client für Java
Die anderen Bigtable-Clientbibliotheken unterstützen den Zugriff auf Ansichten noch nicht.
Alle Methoden, die die Methode ReadRows
oder SampleRowKeys
der Bigtable Data API aufrufen, werden unterstützt. Sie geben die ID der autorisierten Ansicht zusätzlich zur Tabellen-ID an, wenn Sie den Client erstellen.
Lesevorgänge und Leistung
Lesevorgänge mit Filtern sind langsamer als Lesevorgänge ohne Filter und erhöhen außerdem die CPU-Auslastung. Allerdings können Sie damit die beanspruchte Netzwerkbandbreite erheblich reduzieren, da die zurückgegebene Datenmenge begrenzt wird. Im Allgemeinen sollten Filter verwendet werden, um die Durchsatzeffizienz und nicht die Latenz zu steuern.
Wenn Sie die Leseleistung optimieren möchten, sollten Sie die folgenden Strategien in Betracht ziehen:
Schränken Sie das Rowset so weit wie möglich ein. Die Begrenzung der Anzahl der Zeilen, die Ihre Knoten scannen müssen, ist der erste Schritt zur Verbesserung der Zeit bis zum ersten Byte und der Gesamtabfragelatenz. Wenn Sie das Rowset nicht beschränken, muss Bigtable höchstwahrscheinlich die gesamte Tabelle scannen. Aus diesem Grund empfehlen wir Ihnen, das Schema so zu entwerfen, dass Ihre häufigsten Abfragen diese Strategie befolgen können.
Nach dem Einschränken des Rowsets können Sie zur weiteren Leistungsoptimierung einen einfachen Filter hinzufügen. Das Einschränken der Gruppe von Spalten oder der Anzahl der zurückgegebenen Versionen erhöht im Allgemeinen nicht die Latenz und kann manchmal dazu beitragen, dass Bigtable irrelevante Daten in jeder Zeile effizienter bei der Suche übergeht.
Wenn Sie die Leseleistung nach den ersten beiden Strategien noch weiter optimieren möchten, sollten Sie einen komplexeren Filter verwenden. Sie könnten dafür verschiedene Gründe haben:
- Sie erhalten immer noch viele Daten, die Sie nicht benötigen.
- Sie möchten den Anwendungscode vereinfachen, indem Sie die Abfrage in Bigtable verschieben.
Beachten Sie jedoch, dass Filter, die Bedingungen, Interleaves oder einen Regex-Abgleich bei großen Werten erfordern, eher schaden als nützen, wenn sie den Großteil der gescannten Daten durchlassen. Dies führt zu einer erhöhten CPU-Auslastung im Cluster ohne große Einsparungen auf der Clientseite.
Zusätzlich zu diesen Strategien sollten Sie eine große Anzahl nicht zusammenhängender Zeilenschlüssel oder Zeilenbereiche nicht in einer einzelnen Leseanforderung lesen. Wenn Sie in einer einzelnen Anfrage Hunderte von Zeilenschlüsseln oder Zeilenbereichen anfordern, scannt Bigtable die Tabelle und liest die angeforderten Zeilen sequenziell. Diese fehlende Parallelität wirkt sich auf die gesamte Latenz aus und alle Lesevorgänge, die einen Hot-Knoten erreichen, können die tail-Latenz erhöhen. Je mehr Zeilenbereiche angefordert werden, desto länger dauert der Lesevorgang. Wenn diese Latenz nicht akzeptabel ist, sollten Sie stattdessen mehrere gleichzeitige Anfragen senden, die jeweils weniger Zeilenbereiche abrufen.
Im Allgemeinen optimiert das Lesen weiterer Zeilenbereiche in einer einzelnen Anfrage den Durchsatz, jedoch nicht die Latenz. Werden weniger Zeilenbereiche in mehreren gleichzeitigen Anfragen gelesen, wird dadurch die Latenz, nicht der Durchsatz optimiert. Die richtige Balance zwischen Latenz und Durchsatz hängt von den Anforderungen Ihrer Anwendung ab. Dies kann durch eine Anpassung der Anzahl gleichzeitiger Leseanfragen und der Anzahl an Zeilenbereichen in einer Anfrage erreicht werden.
Große Zeilen
Bigtable begrenzt die Größe einer Zeile auf 256 MB. Es ist jedoch möglich, dass dieser Höchstwert versehentlich überschritten wird. Wenn Sie eine Zeile lesen müssen, die größer als das Limit geworden ist, können Sie die Anfrage paginieren und einen cells per row limit
-Filter sowie einen cells per row offset
-Filter verwenden. Beachten Sie, dass der Lesevorgang unter Umständen nicht atomar ist, wenn ein Schreibvorgang für eine Zeile zwischen den paginierten Leseanfragen eingeht.
Nächste Schritte
- Zähler mithilfe von Summenzellen implementieren
- Filterübersicht lesen
- Codebeispiele ansehen, die die Verwendung von Filtern zeigen
- Informationen zu den Arten von Schreibanfragen lesen, die Sie an Bigtable senden können
- Bigtable-Emulator verwenden