BigQuery-Abos

Dieses Dokument bietet einen Überblick über ein BigQuery-Abo, seinen Workflow und die zugehörigen Properties.

Ein BigQuery-Abo ist eine Art Exportabo, bei dem Nachrichten beim Empfang in eine vorhandene BigQuery-Tabelle geschrieben werden. Sie müssen keinen separaten Abonnentenclient konfigurieren. Mit der Google Cloud Console, der Google Cloud CLI, den Clientbibliotheken oder der Pub/Sub API können Sie BigQuery-Abos erstellen, aktualisieren, auflisten, trennen oder löschen.

Ohne den BigQuery-Abotyp benötigen Sie ein Pull- oder Push-Abo und einen Abonnenten (z. B. Dataflow), der Nachrichten liest und in eine BigQuery-Tabelle schreibt. Der Overhead beim Ausführen eines Dataflow-Jobs ist nicht erforderlich, wenn Nachrichten vor dem Speichern in einer BigQuery-Tabelle nicht zusätzlich verarbeitet werden müssen. Sie können stattdessen ein BigQuery-Abo verwenden.

Für Pub/Sub-Systeme, bei denen eine Datentransformation erforderlich ist, bevor die Daten in einer BigQuery-Tabelle gespeichert werden, wird jedoch weiterhin eine Dataflow-Pipeline empfohlen. Informationen zum Streamen von Daten aus Pub/Sub zu BigQuery mit Transformation mit Dataflow finden Sie unter Von Pub/Sub zu BigQuery streamen.

Die Pub/Sub-Abo-zu-BigQuery-Vorlage aus Dataflow erzwingt standardmäßig eine Übermittlung genau einmal. Dies wird in der Regel durch Deduplizierungsmechanismen innerhalb der Dataflow-Pipeline erreicht. Das BigQuery-Abo unterstützt jedoch nur die Zustellung mindestens einmal. Wenn die genaue Deduplizierung für Ihren Anwendungsfall entscheidend ist, sollten Sie nachgelagerte Prozesse in BigQuery verwenden, um potenzielle Duplikate zu verarbeiten.

Hinweise

Bevor Sie dieses Dokument lesen, sollten Sie mit Folgendem vertraut sein:

  • Funktionsweise von Pub/Sub und die verschiedenen Pub/Sub-Begriffe

  • Die verschiedenen Arten von Abos, die Pub/Sub unterstützt, und warum Sie ein BigQuery-Abo verwenden sollten.

  • Informationen zur Funktionsweise von BigQuery und zum Konfigurieren und Verwalten von BigQuery-Tabellen.

BigQuery-Aboworkflow

Die folgende Abbildung zeigt den Workflow zwischen einem BigQuery-Abo und BigQuery.

Nachrichtenfluss für ein BigQuery-Abo
Abbildung 1. Workflow für ein BigQuery-Abo

Hier eine kurze Beschreibung des Workflows, der auf Abbildung 1 verweist:

  1. Pub/Sub verwendet die BigQuery Storage Write API, um Daten an die BigQuery-Tabelle zu senden.
  2. Die Nachrichten werden in Batches an die BigQuery-Tabelle gesendet.
  3. Nach erfolgreichem Abschluss eines Schreibvorgangs gibt die API eine „OK“-Antwort zurück.
  4. Wenn beim Schreibvorgang Fehler auftreten, wird die Pub/Sub-Nachricht selbst negativ bestätigt. Die Nachricht wird dann noch einmal gesendet. Wenn die Nachricht oft genug fehlschlägt und für das Abo ein Thema für unzustellbare Nachrichten konfiguriert ist, wird sie in das entsprechende Thema verschoben.

Eigenschaften eines BigQuery-Abos

Die Eigenschaften, die Sie für ein BigQuery-Abo konfigurieren, bestimmen die BigQuery-Tabelle, in die Pub/Sub Nachrichten schreibt, und den Schematyp dieser Tabelle.

Weitere Informationen finden Sie unter BigQuery-Properties.

Schemakompatibilität

Dieser Abschnitt gilt nur, wenn Sie beim Erstellen eines BigQuery-Abos die Option Schema des Themas verwenden auswählen.

Pub/Sub und BigQuery verwenden unterschiedliche Methoden, um ihre Schemas zu definieren. Pub/Sub-Schemas werden im Apache Avro- oder Protocol Buffer-Format definiert, während BigQuery-Schemas in verschiedenen Formaten definiert werden.

Im Folgenden finden Sie wichtige Informationen zur Schemakompatibilität zwischen einem Pub/Sub-Thema und einer BigQuery-Tabelle.

  • Nachrichten mit einem falsch formatierten Feld werden nicht in BigQuery geschrieben.

  • Im BigQuery-Schema sind INT, SMALLINT, INTEGER, BIGINT, TINYINT und BYTEINT Aliasse für INTEGER, DECIMAL ist ein Alias für NUMERIC und BIGDECIMAL ist ein Alias für BIGNUMERIC.

  • Wenn der Typ im Themenschema string und der Typ in der BigQuery-Tabelle JSON, TIMESTAMP, DATETIME, DATE, TIME, NUMERIC oder BIGNUMERIC ist, muss jeder Wert für dieses Feld in einer Pub/Sub-Nachricht dem für den BigQuery-Datentyp angegebenen Format entsprechen.

  • Einige logische Avro-Typen werden unterstützt, wie in der folgenden Tabelle angegeben. Alle nicht aufgeführten logischen Typen stimmen nur mit dem entsprechenden Avro-Typ überein, der sie annotiert, wie in der Avro-Spezifikation beschrieben.

Im Folgenden finden Sie eine Zuordnung verschiedener Schemaformate zu BigQuery-Datentypen.

Avro-Typen

Avro-Typ BigQuery-Datentyp
null Any NULLABLE
boolean BOOLEAN
int INTEGER, NUMERIC oder BIGNUMERIC
long INTEGER, NUMERIC oder BIGNUMERIC
float FLOAT64, NUMERIC oder BIGNUMERIC
double FLOAT64, NUMERIC oder BIGNUMERIC
bytes BYTES, NUMERIC oder BIGNUMERIC
string STRING, JSON, TIMESTAMP, DATETIME, DATE, TIME, NUMERIC oder BIGNUMERIC
record RECORD/STRUCT
array von Type REPEATED Type
map mit dem Werttyp ValueType REPEATED STRUCT <key STRING, value ValueType>
union mit zwei Typen, von denen einer null und der andere Type ist NULLABLE Type
Sonstige union Nicht kartografierbar
fixed BYTES, NUMERIC oder BIGNUMERIC
enum INTEGER

Logische Avro-Typen

Logischer Avro-Typ BigQuery-Datentyp
timestamp-micros TIMESTAMP
date DATE
time-micros TIME
duration INTERVAL
decimal NUMERIC oder BIGNUMERIC

Protokollpuffertypen

Protokollpuffertyp BigQuery-Datentyp
double FLOAT64, NUMERIC oder BIGNUMERIC
float FLOAT64, NUMERIC oder BIGNUMERIC
int32 INTEGER, NUMERIC, BIGNUMERIC oder DATE
int64 INTEGER, NUMERIC, BIGNUMERIC, DATE, DATETIME oder TIMESTAMP
uint32 INTEGER, NUMERIC, BIGNUMERIC oder DATE
uint64 NUMERIC oder BIGNUMERIC
sint32 INTEGER, NUMERIC oder BIGNUMERIC
sint64 INTEGER, NUMERIC, BIGNUMERIC, DATE, DATETIME oder TIMESTAMP
fixed32 INTEGER, NUMERIC, BIGNUMERIC oder DATE
fixed64 NUMERIC oder BIGNUMERIC
sfixed32 INTEGER, NUMERIC, BIGNUMERIC oder DATE
sfixed64 INTEGER, NUMERIC, BIGNUMERIC, DATE, DATETIME oder TIMESTAMP
bool BOOLEAN
string STRING, JSON, TIMESTAMP, DATETIME, DATE, TIME, NUMERIC oder BIGNUMERIC
bytes BYTES, NUMERIC oder BIGNUMERIC
enum INTEGER
message RECORD/STRUCT
oneof Nicht kartografierbar
map<KeyType, ValueType> REPEATED RECORD<key KeyType, value ValueType>
enum INTEGER
repeated/array of Type REPEATED Type

Ganzzahldarstellung von Datum und Uhrzeit

Wenn Sie eine Ganzzahl einem der Datums- oder Uhrzeittypen zuordnen, muss die Zahl den korrekten Wert darstellen. Im Folgenden finden Sie die Zuordnung von BigQuery-Datentypen zu den entsprechenden Ganzzahlen.

BigQuery-Datentyp Darstellung von Ganzzahlen
DATE Die Anzahl der Tage seit der Unix-Epoche (1. Januar 1970)
DATETIME Datum und Uhrzeit in Mikrosekunden, ausgedrückt als bürgerliche Zeit mit dem CivilTimeEncoder
TIME Die Zeit in Mikrosekunden, ausgedrückt als bürgerliche Zeit mit dem CivilTimeEncoder
TIMESTAMP Die Anzahl der Mikrosekunden seit der Unix-Epoche (1. Januar 1970, 00:00:00 Uhr UTC)

BigQuery Change Data Capture

BigQuery-Abos unterstützen CDC-Aktualisierungen (Change Data Capture), wenn use_topic_schema oder use_table_schema in den Aboeigenschaften auf true festgelegt ist. Wenn Sie die Funktion mit use_topic_schema verwenden möchten, legen Sie das Schema des Themas mit den folgenden Feldern fest:

  • _CHANGE_TYPE (erforderlich): Ein string-Feld, das auf UPSERT oder DELETE gesetzt ist.

    • Wenn für eine Pub/Sub-Nachricht, die in die BigQuery-Tabelle geschrieben wird, _CHANGE_TYPE auf UPSERT festgelegt ist, aktualisiert BigQuery die Zeile mit demselben Schlüssel, falls vorhanden, oder fügt eine neue Zeile ein, falls nicht.

    • Wenn für eine Pub/Sub-Nachricht, die in die BigQuery-Tabelle geschrieben wurde, _CHANGE_TYPE auf DELETE festgelegt ist, löscht BigQuery die Zeile in der Tabelle mit demselben Schlüssel, falls vorhanden.

  • _CHANGE_SEQUENCE_NUMBER (optional): Ein int64- (long-)Feld, das dafür sorgt, dass Aktualisierungen und Löschvorgänge in der BigQuery-Tabelle in der richtigen Reihenfolge verarbeitet werden. Nachrichten mit demselben Zeilenschlüssel müssen einen monoton steigenden Wert für _CHANGE_SEQUENCE_NUMBER enthalten. Nachrichten mit Sequenznummern, die kleiner als die höchste für eine Zeile verarbeitete Sequenznummer sind, haben keine Auswirkungen auf die Zeile in der BigQuery-Tabelle. Hinweis: Für Pub/Sub ist ein ganzzahliger Wert erforderlich, im Gegensatz zum stringbasierten Wert, der bei der direkten Interaktion mit BigQuery verwendet wird.

Wenn Sie die Funktion mit use_table_schema verwenden möchten, fügen Sie die vorherigen Felder in die JSON-Nachricht ein.

Pub/Sub-Dienstkontoberechtigungen

Damit ein BigQuery-Abo erstellt werden kann, muss das Pub/Sub-Dienstkonto die Berechtigung zum Schreiben in die entsprechende BigQuery-Tabelle und zum Lesen der Tabellenmetadaten haben. Weitere Informationen finden Sie unter BigQuery-Rollen dem Pub/Sub-Dienstkonto zuweisen.

Umgang mit Nachrichtenfehlern

Wenn eine Pub/Sub-Nachricht nicht in BigQuery geschrieben werden kann, kann sie nicht bestätigt werden. Wenn Sie solche nicht zustellbaren Nachrichten weiterleiten möchten, konfigurieren Sie ein Thema für unzustellbare Nachrichten für das BigQuery-Abo. Die an das Thema für unzustellbare Nachrichten weitergeleitete Pub/Sub-Nachricht enthält das Attribut CloudPubSubDeadLetterSourceDeliveryErrorMessage mit dem Grund, warum die Pub/Sub-Nachricht nicht in BigQuery geschrieben werden konnte.

Wenn Pub/Sub keine Nachrichten in BigQuery schreiben kann, verzögert Pub/Sub die Zustellung der Nachrichten ähnlich wie beim Push-Backoff-Verhalten. Wenn dem Abo jedoch ein Thema für unzustellbare Nachrichten zugewiesen ist, wird die Zustellung von Pub/Sub nicht ausgesetzt, wenn Nachrichtenfehler auf Schemakompatibilitätsfehler zurückzuführen sind.

Kontingente und Limits

Für den BigQuery-Abonnentendurchsatz pro Region gelten Kontingentlimits. Weitere Informationen finden Sie unter Pub/Sub-Kontingente und Limits.

Bei BigQuery-Abos werden Daten mithilfe der BigQuery Storage Write API geschrieben. Informationen zu Kontingenten und Limits für die Storage Write API finden Sie unter BigQuery Storage Write API-Anfragen. BigQuery-Abos belegen nur das Durchsatzkontingent für die Storage Write API. Die anderen Kontingente für die Storage Write API können in diesem Fall ignoriert werden.

Preise

Die Preise für BigQuery-Abos finden Sie auf der Preisseite für Pub/Sub.

Nächste Schritte