Binäre Löschvektoren in Iceberg V3-Tabellen verwenden

Mit binären Löschvektoren in Apache Iceberg V3-Tabellen können Sie Löschungen auf Zeilenebene in .puffin-Dateien aufzeichnen, ohne ganze Datendateien neu schreiben zu müssen. Anstatt teure Joins zur Abfragezeit durchzuführen, verwenden Engines wie BigQuery, Managed Service for Apache Spark, Apache Flink und Trino diese Vektoren, um gelöschte Zeilen beim Lesen zu identifizieren und zu überspringen.

Diese Optimierung wird im Lakehouse-Laufzeitkatalog unterstützt und kann die Schreib- und Leseleistung für Change Data Capture-Pipelines (CDC) mit hohem Volumen verbessern. Außerdem können Sie damit gesetzliche Anforderungen wie die DSGVO (Recht auf Vergessenwerden) erfüllen, indem Sie einzelne Datensätze löschen, ohne dass Datendateien neu geschrieben werden müssen.

Hinweis

  1. Prüfen Sie, ob die Abrechnung für Ihr Google Cloud -Projekt aktiviert ist.

  2. Aktivieren Sie die BigLake API, falls sie noch nicht aktiviert ist.

    Erforderliche Rollen zum Aktivieren von APIs

    Zum Aktivieren von APIs benötigen Sie die Berechtigung serviceusage.services.enable. Wenn Sie das Projekt erstellt haben, haben Sie diese Berechtigung wahrscheinlich bereits über die Inhaberrolle (roles/owner). Andernfalls können Sie diese Berechtigung über die Rolle „Service Usage-Administrator“ (roles/serviceusage.serviceUsageAdmin) erhalten. Informationen zum Zuweisen von Rollen

    API aktivieren

Erforderliche Rollen

Bitten Sie Ihren Administrator, Ihnen die folgenden IAM-Rollen für Ihr Projekt und Ihren Storage-Bucket zuzuweisen, um die Berechtigungen zu erhalten, die Sie zum Erstellen und Verwalten von Iceberg V3-Tabellen benötigen:

  • Iceberg V3-Tabellen erstellen und verwalten:
    • BigLake-Administrator (roles/biglake.admin) – Ihr Projekt
    • Storage-Administrator (roles/storage.admin) – der Cloud Storage-Ziel-Bucket

Weitere Informationen zum Zuweisen von Rollen finden Sie unter Zugriff auf Projekte, Ordner und Organisationen verwalten.

Sie können die erforderlichen Berechtigungen auch über benutzerdefinierte Rollen oder andere vordefinierte Rollen erhalten.

Iceberg-REST-Katalog einrichten

Bevor Sie eine Iceberg V3-Tabelle erstellen, müssen Sie den Iceberg-REST-Katalog einrichten. Dazu gehört das Erstellen eines Namespace und eines Katalogs.

Das Einrichten des Iceberg-REST-Katalogs kann einige Zeit dauern. Achten Sie darauf, dass Sie sowohl den Namespace als auch den Katalog erstellen, bevor Sie fortfahren.

Beschränkungen

Für Iceberg V3-Tabellen im Lakehouse-Laufzeitkatalog gelten die folgenden Einschränkungen:

  • Neue V3-Datentypen: Neue Iceberg-V3-Datentypen (z. B. Variant, Geography, Nanosekunden-Zeitstempel, Standardwerte und unbekannte Datentypen) werden nicht unterstützt.
  • Zeilenherkunftstracking: Das Zeilenherkunftstracking wird nicht unterstützt.
  • BigQuery-Schreibvorgänge: BigQuery-Schreibvorgänge werden für V3-Tabellen nicht unterstützt. Sie können V3-Tabellen nur aus BigQuery lesen. Zum Erstellen und Schreiben von V3-Tabellen müssen Sie Open-Source-Engines wie Apache Spark, Apache Flink oder Trino verwenden.

Anforderungen an die Suchmaschine

Verwenden Sie eine Engine-Version, die Iceberg V3 und binäre Löschvektoren unterstützt. Apache Spark 3.5 oder höher wird empfohlen. In den Beispielen in diesem Leitfaden wird iceberg-spark-runtime-3.5_2.12:1.10.1 verwendet.

Achten Sie beim Konfigurieren der Tabelle und der Engine-Sitzung auf Folgendes:

  • Tabellenformatversion: Muss auf format-version='3' festgelegt sein.
  • Löschmodus: Muss auf merge-on-read festgelegt sein. In diesem Modus werden Löschvorgänge in separate Dateien (die Löschvektoren) geschrieben, anstatt die ursprünglichen Datendateien neu zu schreiben (Copy-on-Write).

Beispiel für eine Spark-Sitzungskonfiguration

Mit der folgenden Konfiguration werden die erforderlichen Iceberg-Erweiterungen aktiviert und die REST-Katalogverbindung eingerichtet:

spark-sql \
    --packages org.apache.iceberg:iceberg-spark-runtime-3.5_2.12:1.10.1,org.apache.iceberg:iceberg-gcp:1.10.1 \
    --jars https://storage-download.googleapis.com/maven-central/maven2/org/apache/iceberg/iceberg-gcp-bundle/1.10.1/iceberg-gcp-bundle-1.10.1.jar \
    --conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions \
    --conf spark.sql.catalog.CATALOG_NAME=org.apache.iceberg.spark.SparkCatalog \
    --conf spark.sql.catalog.CATALOG_NAME.type=rest \
    --conf spark.sql.catalog.CATALOG_NAME.uri=https://biglake.googleapis.com/iceberg/v1/restcatalog \
    --conf spark.sql.catalog.CATALOG_NAME.warehouse=WAREHOUSE_PATH \
    --conf spark.sql.catalog.CATALOG_NAME.header.x-goog-user-project=PROJECT_ID \
    --conf spark.sql.catalog.CATALOG_NAME.rest.auth.type=org.apache.iceberg.gcp.auth.GoogleAuthManager \
    --conf spark.sql.catalog.CATALOG_NAME.io-impl=org.apache.iceberg.gcp.gcs.GCSFileIO \
    --conf spark.sql.defaultCatalog=CATALOG_NAME

Ersetzen Sie Folgendes:

  • CATALOG_NAME: der Name Ihres Apache Iceberg REST-Katalogendpunkts.
  • WAREHOUSE_PATH: der URI des Cloud Storage-Ordners, in dem Ihr Data Warehouse gespeichert ist, beginnend mit gs://.
  • PROJECT_ID: Projekt-ID in Google Cloud .

Binäre Löschvektoren verwenden

Wenn Sie binäre Löschvektoren in Apache Iceberg V3-Tabellen verwenden möchten, müssen Sie eine Tabelle mit der Formatierungsversion 3 erstellen, die Tabelle mit Daten füllen, Standarddatenbankänderungen vornehmen und die Tabelle abfragen. Sie können alle create-, insert-, delete- und update-Anweisungen mit Spark SQL ausführen.

Iceberg-Tabelle mit binären Löschvektoren erstellen

Erstellen Sie eine Tabelle und geben Sie in den Tabelleneigenschaften format-version='3' und die Lösch-, Aktualisierungs- und Zusammenführungsmodi merge-on-read an. Führen Sie die folgende Anweisung in Spark SQL aus:

Spark

CREATE NAMESPACE IF NOT EXISTS my_namespace;
USE my_namespace;

CREATE TABLE my_namespace.mytable_v3 (
   id BIGINT,
   city STRING,
   state STRING
) TBLPROPERTIES (
   'format-version'='3',
   'write.delete.mode'='merge-on-read',
   'write.update.mode'='merge-on-read',
   'write.merge.mode'='merge-on-read'
);

Iceberg-V2-Tabelle auf V3 aktualisieren

Sie können eine vorhandene Iceberg V2-Tabelle mit ALTER TABLE-Anweisungen auf V3 aktualisieren. Das Downgraden einer Tabelle von V3 auf V2 wird nicht unterstützt. Führen Sie die folgende Anweisung in Spark SQL aus:

Spark

ALTER TABLE my_namespace.mytable_v2 SET TBLPROPERTIES ('format-version' = '3');

Daten in die Tabelle einfügen

Damit für Löschvorgänge binäre Löschvektordateien generiert werden, darf die Engine nicht auf Copy-on-Write zurückgreifen. Dazu ist in der Regel eine erhebliche Datenmenge in der Tabelle vor dem Löschvorgang erforderlich. Beispielsweise kann Apache Spark kleine Löschvorgänge optimieren, indem es auf Copy-on-Write zurückgreift. Füllen Sie die Tabelle, indem Sie die folgenden Anweisungen in Spark SQL ausführen:

Spark

-- Create a temporary view with a large number of rows (100,000 rows)
CREATE OR REPLACE TEMPORARY VIEW large_source AS
SELECT
  id,
  CAST(id AS STRING) as city,
  'WA' as state
FROM (
  SELECT row_number() OVER (ORDER BY (SELECT NULL)) as id
  FROM (SELECT 0 FROM range(1000)) a
  CROSS JOIN (SELECT 0 FROM range(100)) b
);

-- Overwrite the existing table with the generated data
INSERT OVERWRITE my_namespace.mytable_v3 SELECT * FROM large_source;

Daten löschen

Führen Sie eine DELETE-Anweisung in Spark SQL aus. Da die Tabelle für merge-on-read konfiguriert ist und genügend Daten enthält, generiert Spark Löschdateien mit binären Löschvektoren.

Spark

DELETE FROM my_namespace.mytable_v3 WHERE id = 5000;

Daten aktualisieren

Führen Sie eine UPDATE-Anweisung in Spark SQL aus. Da die Tabelle für merge-on-read konfiguriert ist und genügend Daten enthält, generiert Spark Löschdateien mit binären Löschvektoren.

Spark

UPDATE my_namespace.mytable_v3 SET state = 'NY' WHERE id = 1;

Tabelle abfragen

Bei Abfragen der Tabelle werden automatisch die binären Löschvektordateien verwendet, um gelöschte Zeilen auszuschließen. Sie können die Tabelle mit Apache Spark oder BigQuery abfragen.

Spark

-- Should be less than the initial 100,000 rows
SELECT count(*) FROM my_namespace.mytable_v3;

-- Should return no results
SELECT * FROM my_namespace.mytable_v3 WHERE id = 5000;

-- Should return 'NY'
SELECT * FROM my_namespace.mytable_v3 WHERE id = 1;

BigQuery

Verwenden Sie beim Abfragen von BigQuery die vollständig qualifizierte Tabellen-ID PROJECT_ID.CATALOG_NAME.my_namespace.mytable_v3.

bq query --nouse_legacy_sql \
    'SELECT * FROM `PROJECT_ID.CATALOG_NAME.my_namespace.mytable_v3` LIMIT 10'

Erstellung von binären Löschvektoren prüfen

Sie können prüfen, ob binäre Löschvektoren erfolgreich erstellt wurden, indem Sie das Speicherverzeichnis und die Snapshot-Metadaten prüfen.

Nach .puffin-Dateien suchen

Rufen Sie das Datenverzeichnis der Tabelle in Ihrem Cloud Storage-Warehouse auf (z. B. gs://WAREHOUSE_BUCKET/my_namespace/mytable_v3/data). Dort sollten Sie .puffin-Dateien finden, in denen die binären Löschvektoren gespeichert sind.

Snapshot-Metadaten prüfen

Die Snapshot-Metadaten in den JSON-Dateien der Iceberg-Tabelle enthalten Informationen zum Löschvorgang. Suchen Sie in der Snapshot-Zusammenfassung nach Attributen wie added-delete-files, added-dvs und operation. Dies bestätigt, dass Löschdateien hinzugefügt wurden.

"summary": {
  "operation": "delete",
  "added-delete-files": "1",
  "added-dvs": "1",
  "added-files-size": "42",
  "added-position-deletes": "1",
  ...
}

Nächste Schritte