Lakehouse mit Spark und Lakehouse-Laufzeitkatalog erstellen
Eine Lakehouse-Architektur kombiniert die Flexibilität eines Data Lake mit den Datenverwaltungsfunktionen eines Data Warehouse. In diesem Dokument erfahren Sie, wie Sie ein Lakehouse in Google Cloudeinrichten. Sie verwenden Apache Iceberg als Tabellenformat, Managed Service for Apache Spark für die Verarbeitung und den Lakehouse-Laufzeitkatalog Iceberg REST-Katalog für die einheitliche Metadatenverwaltung.
In dieser Architektur werden offene Tabellenformate wie Iceberg verwendet, um Daten in Cloud Storage um Data-Warehouse-Funktionen wie Transaktionen und Schema-Weiterentwicklung zu erweitern. So wird eine zentrale Informationsquelle für Ihre Daten geschaffen, auf die verschiedene Engines zugreifen können.
In diesem Dokument werden Kataloge behandelt, die Sie im Lakehouse-Laufzeitkatalog erstellen. Informationen zum Abfragen von Iceberg-Tabellen, die von AWS Glue Data Catalog, Databricks Unity Catalog oder Snowflake Horizon Catalog über föderierte Kataloge der Lakehouse-Laufzeit verwaltet werden, finden Sie unter Föderierte Kataloge mit Spark abfragen.
Hinweis
- Melden Sie sich in Ihrem Google Cloud -Konto an. Wenn Sie mit Google Cloudnoch nicht vertraut sind, erstellen Sie einfach ein Konto, um die Leistungsfähigkeit unserer Produkte in der Praxis sehen und bewerten zu können. Neukunden erhalten außerdem ein Guthaben von 300 $, um Arbeitslasten auszuführen, zu testen und bereitzustellen.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that you have the permissions required to complete this guide.
-
Verify that billing is enabled for your Google Cloud project.
Enable the Dataproc, BigLake, BigQuery, and Cloud Storage APIs, if any are not already enabled.
Roles required to enable APIs
To enable APIs, you need the
serviceusage.services.enablepermission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that you have the permissions required to complete this guide.
-
Verify that billing is enabled for your Google Cloud project.
Enable the Dataproc, BigLake, BigQuery, and Cloud Storage APIs, if any are not already enabled.
Roles required to enable APIs
To enable APIs, you need the
serviceusage.services.enablepermission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.- Erstellen Sie einen Cloud Storage-Bucket zum Speichern von Iceberg-Daten.
- Erstellen Sie einen Katalog im Lakehouse-Laufzeitkatalog, der auf Ihren Bucket verweist. Ein Katalog mit mehreren Buckets wird empfohlen.
Erforderliche Rollen
Für die Beispiele auf dieser Seite sind bestimmte IAM-Rollen (Identity and Access Management) erforderlich. Je nach Organisationsrichtlinien wurden diese Rollen möglicherweise bereits gewährt. Informationen zum Prüfen von Rollenzuweisungen finden Sie unter Müssen Sie Rollen zuweisen?.
Weitere Informationen zum Zuweisen von Rollen finden Sie unter Zugriff auf Projekte, Ordner und Organisationen verwalten.
Welche Rollen Sie benötigen, hängt davon ab, wie Ihre Arbeitslast ausgeführt wird.
Managed Service for Apache Spark-Cluster und serverlose Managed Service for Apache Spark-Laufzeiten 2.3 und früher führen Arbeitslasten als Dienstkonto aus. Serverlose Laufzeiten von Managed Service for Apache Spark ab Version 3.0 führen Arbeitslasten standardmäßig mit Ihren Endnutzer-Anmeldedaten (EUC) aus. Daher weisen Sie Ihrem Nutzerkonto anstelle eines Dienstkontos Rollen für den Datenzugriff zu. Wenn Sie ein benutzerdefiniertes Dienstkonto für eine Laufzeit der Version 3.0 oder höher angeben, wird die Arbeitslast mit den Anmeldedaten des Dienstkontos ausgeführt. Weitere Informationen finden Sie unter Rollen für serverlose Bereitstellungen.
Nutzerrollen
Bitten Sie Ihren Administrator, Ihnen die folgenden IAM-Rollen zuzuweisen, um die Berechtigungen zu erhalten, die Sie zum Erstellen eines Managed Service for Apache Spark-Clusters, zum Senden einer Batcharbeitslast oder zum Erstellen einer interaktiven Sitzung benötigen:
-
Verwenden Sie einen Cluster oder eine serverlose Laufzeit 2.3 oder früher:
- Dataproc-Bearbeiter (
roles/dataproc.editor) für das Projekt - Dienstkontonutzer (
roles/iam.serviceAccountUser) für das Compute Engine-Standarddienstkonto oder ein benutzerdefiniertes Dienstkonto
- Dataproc-Bearbeiter (
-
Verwenden Sie eine serverlose Laufzeitversion 3.0 oder höher:
Dataproc Serverless-Bearbeiter (
roles/dataproc.serverlessEditor) für das Projekt -
Dienstkonto-Anmeldedaten in einer serverlosen Laufzeitversion 3.0 oder höher verwenden: Service Account User (
roles/iam.serviceAccountUser) für das benutzerdefinierte Dienstkonto
Wenn Sie eine serverlose Laufzeit von Managed Service for Apache Spark ab Version 3.0 mit Endnutzer-Anmeldedaten (Standardeinstellung) verwenden, benötigen Sie außerdem die folgenden Datenzugriffsrollen:
Bitten Sie Ihren Administrator, Ihnen die folgenden IAM-Rollen zuzuweisen, um die Berechtigungen zu erhalten, die Sie zum Lesen und Schreiben von Tabellen in Ihrem Katalog mit Endnutzeranmeldedaten benötigen:
-
Tabellendaten im Modus für die Bereitstellung von Anmeldedaten lesen und schreiben: BigLake Editor (
roles/biglake.editor) für das Projekt, das den Katalog enthält -
Katalogressourcen verwalten und Tabellendaten im Modus ohne Bereitstellung von Anmeldedaten schreiben:
- BigLake Editor (
roles/biglake.editor) für das Projekt, das den Katalog enthält - Storage Object User (
roles/storage.objectUser) für alle Cloud Storage-Buckets, die mit dem Katalog verknüpft sind
- BigLake Editor (
Dienstkontorollen
Weisen Sie dem Dienstkonto, das Ihre Arbeitslast ausführt, die folgenden Rollen zu.
Für serverlose Laufzeiten von Managed Service for Apache Spark 3.0 und höher sind diese Rollen nur erforderlich, wenn die Arbeitslast mit Dienstkontoanmeldedaten ausgeführt wird.
Damit das Compute Engine-Standarddienstkonto oder ein benutzerdefiniertes Dienstkonto die erforderlichen Berechtigungen zum Ausführen von Managed Service for Apache Spark-Jobs und zum Lesen und Schreiben von Tabellen in Ihrem Katalog hat, bitten Sie Ihren Administrator, dem Compute Engine-Standarddienstkonto oder einem benutzerdefinierten Dienstkonto die folgenden IAM-Rollen zuzuweisen:
-
Managed Service for Apache Spark-Jobs in einem Cluster oder einer serverlosen Laufzeitversion 2.3 oder früher ausführen:
Dataproc Worker (
roles/dataproc.worker) im Projekt -
Managed Service for Apache Spark-Jobs in einer serverlosen Laufzeitversion 3.0 oder höher ausführen:
- Dataproc Serverless Node (
roles/dataproc.serverlessNode) für das Projekt - Dataproc Resource Manager Node Service Agent (
roles/dataprocrm.nodeServiceAgent) für das Projekt
- Dataproc Serverless Node (
-
Tabellendaten im Credential Vending-Modus lesen und schreiben:
BigLake-Editor (
roles/biglake.editor) für das Projekt, das den Katalog enthält -
Katalogressourcen verwalten und Tabellendaten im Modus ohne Bereitstellung von Anmeldedaten schreiben:
- BigLake Editor (
roles/biglake.editor) für das Projekt, das den Katalog enthält - Storage Object User (
roles/storage.objectUser) für alle Cloud Storage-Buckets, die mit dem Katalog verknüpft sind
- BigLake Editor (
Managed Service for Apache Spark konfigurieren und eine Spark-Sitzung erstellen
Konfigurieren Sie einen Managed Service for Apache Spark-Cluster, eine serverlose Batcharbeitslast von Managed Service for Apache Spark oder eine serverlose interaktive Sitzung von Managed Service for Apache Spark, um den Lakehouse-Laufzeitkatalog Iceberg REST Catalog zu verwenden. Alle drei unterstützen die vereinfachte Konfigurationseigenschaft dataproc.lakehouse.catalog.CATALOG_NAME (empfohlen). Damit kann Managed Service for Apache Spark die Katalogdefinition lesen und die Spark-Properties für den Iceberg REST-Katalog generieren. Nur die Clusterform verwendet das Präfix dataproc:.
Unterstützte Image- und Laufzeitversionen:
Sowohl die vereinfachte als auch die manuelle Konfiguration verwenden die Google-Autorisierung für Iceberg (GoogleAuthManager), für die eine der folgenden Versionen erforderlich ist:
- Managed Service for Apache Spark-Cluster:
2.2-Imageversionen2.2.65und höher oder2.3-Imageversionen2.3.11und höher. - Serverlose Batch-Arbeitslasten und interaktive Sitzungen von Managed Service for Apache Spark:
2.2-Laufzeiten2.2.60und höher,2.3-Laufzeiten2.3.10und höher oder3.0-Laufzeiten.
Für serverlose Batcharbeitslasten und interaktive Sitzungen hängen die erforderlichen Rollen von der Laufzeitversion ab. In Laufzeiten ab 3.0 werden standardmäßig Endnutzer-Anmeldedaten verwendet. Weitere Informationen finden Sie unter Erforderliche Rollen.
Cluster
Erstellen Sie einen Managed Service for Apache Spark-Cluster mit den optionalen Komponenten „Iceberg“ und „Jupyter“ mithilfe vereinfachter Konfigurationseigenschaften (empfohlen) oder durch manuelles Angeben von Katalogeigenschaften in Ihrem Notebook.
Vereinfachte Konfiguration mit Properties (empfohlen)
Erstellen Sie den Cluster mit dem Katalogattribut:
gcloud dataproc clusters create CLUSTER_NAME \ --project=PROJECT_ID \ --region=REGION \ --image-version=IMAGE_VERSION \ --optional-components=ICEBERG,JUPYTER \ --enable-component-gateway \ --properties='dataproc:dataproc.lineage.enabled=true,dataproc:dataproc.lakehouse.catalog.CATALOG_NAME=projects/PROJECT_ID/catalogs/CATALOG_ID,spark:spark.sql.defaultCatalog=CATALOG_NAME'
Ersetzen Sie Folgendes:
CLUSTER_NAME: Ein Name für Ihren Cluster.PROJECT_ID: IhreGoogle Cloud -Projekt-ID.REGION: Die Google Cloud-Region für den Cluster, z. B.us-central1.IMAGE_VERSION: die Image-Version von Managed Service for Apache Spark, z. B.2.3-debian12. Weitere Informationen finden Sie unter Unterstützte Image- und Laufzeitversionen.CATALOG_NAME: Ein Name für den lokalen Spark-Katalog, z. B.iceberg_catalog. Er kann mitCATALOG_IDidentisch sein.CATALOG_ID: Die ID des Katalogs, den Sie unter Vorbereitung erstellt haben.
Die Eigenschaft dataproc:dataproc.lineage.enabled=true ist nicht erforderlich, damit der Iceberg-REST-Katalog des Lakehouse-Laufzeitkatalogs korrekt funktioniert. Sie wird im Beispiel für die Datenherkunft für das Herkunfts-Tracking hinzugefügt.
Stellen Sie über ein Jupyter-Notebook (entweder ein Vertex AI Workbench-Notebook oder ein auf dem Cluster gestartetes Notebook) eine Verbindung zum Cluster her und erstellen Sie SparkSession, ohne Katalogkonfigurationen anzugeben:
from pyspark.sql import SparkSession spark = SparkSession.builder.appName("APP_NAME").getOrCreate()
Ersetzen Sie APP_NAME durch den Namen Ihrer Spark-Anwendung.
Manuelle Konfiguration
Wenn Sie das vereinfachte Konfigurationsattribut nicht verwenden, erstellen Sie den Cluster wie oben beschrieben ohne dataproc:dataproc.lakehouse.catalog. im Flag --properties, stellen Sie eine Verbindung zu einem Jupyter-Notebook her und konfigurieren Sie SparkSession manuell so:
import pyspark from pyspark.context import SparkContext from pyspark.sql import SparkSession catalog_name = "CATALOG_NAME" spark = SparkSession.builder.appName("APP_NAME") \ .config('spark.sql.defaultCatalog', catalog_name) \ .config(f'spark.sql.catalog.{catalog_name}', 'org.apache.iceberg.spark.SparkCatalog') \ .config(f'spark.sql.catalog.{catalog_name}.type', 'rest') \ .config(f'spark.sql.catalog.{catalog_name}.uri', 'https://biglake.googleapis.com/iceberg/v1/restcatalog') \ .config(f'spark.sql.catalog.{catalog_name}.warehouse', 'WAREHOUSE_PATH') \ .config(f'spark.sql.catalog.{catalog_name}.header.x-goog-user-project', 'PROJECT_ID') \ .config(f'spark.sql.catalog.{catalog_name}.rest.auth.type', 'org.apache.iceberg.gcp.auth.GoogleAuthManager') \ .config(f'spark.sql.catalog.{catalog_name}.io-impl', 'org.apache.iceberg.gcp.gcs.GCSFileIO') \ .config('spark.sql.extensions', 'org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions') \ .getOrCreate()
Ersetzen Sie Folgendes:
CATALOG_NAME: ein Name für den lokalen Spark-Katalog, z. B.iceberg_catalog.APP_NAME: der Name Ihrer Spark-Anwendung.WAREHOUSE_PATH: der Pfad zu Ihrem Warehouse. Verwenden Sie für Kataloge mit mehreren Buckets (empfohlen)bl://projects/PROJECT_ID/catalogs/CATALOG_ID. Verwenden Sie für Kataloge mit einem Bucketgs://CLOUD_STORAGE_BUCKET_NAME.PROJECT_ID: Ihre Google Cloud -Projekt-ID.
Mit dem Bereitstellen von Anmeldedaten konfigurieren
Wenn Sie die Bereitstellung von Anmeldedaten verwenden möchten, müssen Sie einen Katalog im Modus für die Bereitstellung von Anmeldedaten verwenden und den Header X-Iceberg-Access-Delegation mit dem Wert vended-credentials zu Iceberg-REST-Kataloganfragen hinzufügen. Fügen Sie dazu dem SparkSession-Builder die folgende Zeile hinzu:
.config(f'spark.sql.catalog.{catalog_name}.header.X-Iceberg-Access-Delegation', 'vended-credentials')
Im folgenden Beispiel wird der SparkSession mit der Ausgabe von Anmeldedaten konfiguriert:
from pyspark.sql import SparkSession catalog_name = "CATALOG_NAME" spark = SparkSession.builder.appName("APP_NAME") \ .config('spark.sql.defaultCatalog', catalog_name) \ .config(f'spark.sql.catalog.{catalog_name}', 'org.apache.iceberg.spark.SparkCatalog') \ .config(f'spark.sql.catalog.{catalog_name}.type', 'rest') \ .config(f'spark.sql.catalog.{catalog_name}.uri', 'https://biglake.googleapis.com/iceberg/v1/restcatalog') \ .config(f'spark.sql.catalog.{catalog_name}.warehouse', 'WAREHOUSE_PATH') \ .config(f'spark.sql.catalog.{catalog_name}.header.x-goog-user-project', 'PROJECT_ID') \ .config(f'spark.sql.catalog.{catalog_name}.rest.auth.type', 'org.apache.iceberg.gcp.auth.GoogleAuthManager') \ .config(f'spark.sql.catalog.{catalog_name}.io-impl', 'org.apache.iceberg.gcp.gcs.GCSFileIO') \ .config(f'spark.sql.catalog.{catalog_name}.header.X-Iceberg-Access-Delegation', 'vended-credentials') \ .config('spark.sql.extensions', 'org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions') \ .getOrCreate()
Bei der vereinfachten Konfiguration wird dieser Header hinzugefügt, wenn für den Katalog der Modus „Anmeldedaten bereitstellen“ verwendet wird. Weitere Informationen finden Sie in der Iceberg-Dokumentation im Abschnitt
Header in RESTCatalog.
Serverlos
Senden Sie eine PySpark-Batcharbeitslast an Managed Service for Apache Spark Serverless. Verwenden Sie dazu vereinfachte Konfigurationseigenschaften (empfohlen) oder geben Sie Katalogeigenschaften manuell an.
Vereinfachte Konfiguration mit Properties (empfohlen)
Übergeben Sie die Property dataproc.lakehouse.catalog.CATALOG_NAME (ohne das Präfix dataproc:), wenn Sie die Batcharbeitslast senden:
gcloud dataproc batches submit pyspark PYSPARK_FILE \ --project=PROJECT_ID \ --region=REGION \ --version=RUNTIME_VERSION \ --properties="dataproc.lakehouse.catalog.CATALOG_NAME=projects/PROJECT_ID/catalogs/CATALOG_ID,spark.sql.defaultCatalog=CATALOG_NAME"
Ersetzen Sie Folgendes:
PYSPARK_FILE: dergs://-Cloud Storage-Pfad zu Ihrer PySpark-Anwendungsdatei.PROJECT_ID: IhreGoogle Cloud -Projekt-ID.REGION: die Region für Ihre Batch-Arbeitslast.RUNTIME_VERSION: die serverlose Laufzeitversion von Managed Service for Apache Spark, z. B.3.0. Die erforderlichen Rollen hängen von der Laufzeitversion ab (siehe Unterstützte Image- und Laufzeitversionen).CATALOG_NAME: Ein Name für den lokalen Spark-Katalog, z. B.iceberg_catalog. Er kann mitCATALOG_IDidentisch sein.CATALOG_ID: die ID des Katalogs, den Sie unter Vorbereitung erstellt haben.
Erstellen Sie in Ihrer PySpark-Anwendungsdatei die SparkSession, ohne Katalogkonfigurationen anzugeben:
from pyspark.sql import SparkSession spark = SparkSession.builder.appName("APP_NAME").getOrCreate()
Manuelle Konfiguration
Wenn Sie das vereinfachte Konfigurationsattribut nicht verwenden, geben Sie die Katalogattribute im Flag --properties an, wenn Sie die Batcharbeitslast einreichen:
gcloud dataproc batches submit pyspark PYSPARK_FILE \ --project=PROJECT_ID \ --region=REGION \ --version=RUNTIME_VERSION \ --properties="\ spark.sql.defaultCatalog=CATALOG_NAME,\ spark.sql.catalog.CATALOG_NAME=org.apache.iceberg.spark.SparkCatalog,\ spark.sql.catalog.CATALOG_NAME.type=rest,\ spark.sql.catalog.CATALOG_NAME.uri=https://biglake.googleapis.com/iceberg/v1/restcatalog,\ spark.sql.catalog.CATALOG_NAME.warehouse=WAREHOUSE_PATH,\ spark.sql.catalog.CATALOG_NAME.header.x-goog-user-project=PROJECT_ID,\ spark.sql.catalog.CATALOG_NAME.rest.auth.type=org.apache.iceberg.gcp.auth.GoogleAuthManager,\ spark.sql.catalog.CATALOG_NAME.io-impl=org.apache.iceberg.gcp.gcs.GCSFileIO,\ spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions"
Ersetzen Sie WAREHOUSE_PATH durch den Pfad zu Ihrem Warehouse. Verwenden Sie für Kataloge mit mehreren Buckets (empfohlen) bl://projects/PROJECT_ID/catalogs/CATALOG_ID.
Verwenden Sie für Kataloge mit einem Bucket gs://CLOUD_STORAGE_BUCKET_NAME.
Mit dem Bereitstellen von Anmeldedaten konfigurieren
Wenn Sie die Bereitstellung von Anmeldedaten verwenden möchten, müssen Sie einen Katalog im Modus für die Bereitstellung von Anmeldedaten verwenden und den Header X-Iceberg-Access-Delegation mit dem Wert vended-credentials zu Iceberg REST-Kataloganfragen hinzufügen. Fügen Sie dazu dem Flag --properties das folgende Attribut hinzu:
spark.sql.catalog.CATALOG_NAME.header.X-Iceberg-Access-Delegation=vended-credentialsIm folgenden Beispiel wird eine Batcharbeitslast mit der Bereitstellung von Anmeldedaten gesendet:
gcloud dataproc batches submit pyspark PYSPARK_FILE \ --project=PROJECT_ID \ --region=REGION \ --version=RUNTIME_VERSION \ --properties="\ spark.sql.defaultCatalog=CATALOG_NAME,\ spark.sql.catalog.CATALOG_NAME=org.apache.iceberg.spark.SparkCatalog,\ spark.sql.catalog.CATALOG_NAME.type=rest,\ spark.sql.catalog.CATALOG_NAME.uri=https://biglake.googleapis.com/iceberg/v1/restcatalog,\ spark.sql.catalog.CATALOG_NAME.warehouse=WAREHOUSE_PATH,\ spark.sql.catalog.CATALOG_NAME.header.x-goog-user-project=PROJECT_ID,\ spark.sql.catalog.CATALOG_NAME.rest.auth.type=org.apache.iceberg.gcp.auth.GoogleAuthManager,\ spark.sql.catalog.CATALOG_NAME.io-impl=org.apache.iceberg.gcp.gcs.GCSFileIO,\ spark.sql.catalog.CATALOG_NAME.header.X-Iceberg-Access-Delegation=vended-credentials,\ spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions"
Bei der vereinfachten Konfiguration wird dieser Header hinzugefügt, wenn für den Katalog der Modus „Anmeldedaten bereitstellen“ verwendet wird. Weitere Informationen finden Sie in der Iceberg-Dokumentation im Abschnitt Header in RESTCatalog.
Serverlos
Erstellen Sie eine serverlose interaktive Sitzung für Managed Service for Apache Spark aus einem Notebook mit der DataprocSparkSession-API. Verwenden Sie dazu vereinfachte Konfigurationseigenschaften (empfohlen) oder geben Sie Katalogeigenschaften manuell an.
Vereinfachte Konfiguration mit Properties (empfohlen)
Übergeben Sie in einem Notebook, in dem das Paket dataproc-spark-connect installiert ist, z. B. einem BigQuery Studio-Notebook oder einem Vertex AI Workbench-Notebook, beim Erstellen der Sitzung das Attribut dataproc.lakehouse.catalog.CATALOG_NAME (ohne das Präfix dataproc:):
from google.cloud.dataproc_spark_connect import DataprocSparkSession from google.cloud.dataproc_v1 import Session catalog_name = "CATALOG_NAME" session_config = Session() session_config.runtime_config.version = 'RUNTIME_VERSION' spark = DataprocSparkSession.builder.appName("APP_NAME") \ .dataprocSessionConfig(session_config) \ .config(f'dataproc.lakehouse.catalog.{catalog_name}', 'projects/PROJECT_ID/catalogs/CATALOG_ID') \ .config('spark.sql.defaultCatalog', catalog_name) \ .getOrCreate()
Ersetzen Sie Folgendes:
CATALOG_NAME: Ein Name für den lokalen Spark-Katalog, z. B.iceberg_catalog. Er kann mitCATALOG_IDidentisch sein.RUNTIME_VERSION: die serverlose Laufzeitversion von Managed Service for Apache Spark, z. B.3.0. Die erforderlichen Rollen hängen von der Laufzeitversion ab (siehe Unterstützte Image- und Laufzeitversionen).APP_NAME: der Name Ihrer Spark-Anwendung.PROJECT_ID: IhreGoogle Cloud -Projekt-ID.CATALOG_ID: die ID des Katalogs, den Sie unter Vorbereitung erstellt haben.
Sie können diese Attribute auch in einer Sitzungsvorlage festlegen.
Manuelle Konfiguration
Wenn Sie das vereinfachte Konfigurationsattribut nicht verwenden, geben Sie die Katalogattribute beim Erstellen der Sitzung an:
from google.cloud.dataproc_spark_connect import DataprocSparkSession from google.cloud.dataproc_v1 import Session catalog_name = "CATALOG_NAME" session_config = Session() session_config.runtime_config.version = 'RUNTIME_VERSION' spark = DataprocSparkSession.builder.appName("APP_NAME") \ .dataprocSessionConfig(session_config) \ .config('spark.sql.defaultCatalog', catalog_name) \ .config(f'spark.sql.catalog.{catalog_name}', 'org.apache.iceberg.spark.SparkCatalog') \ .config(f'spark.sql.catalog.{catalog_name}.type', 'rest') \ .config(f'spark.sql.catalog.{catalog_name}.uri', 'https://biglake.googleapis.com/iceberg/v1/restcatalog') \ .config(f'spark.sql.catalog.{catalog_name}.warehouse', 'WAREHOUSE_PATH') \ .config(f'spark.sql.catalog.{catalog_name}.header.x-goog-user-project', 'PROJECT_ID') \ .config(f'spark.sql.catalog.{catalog_name}.rest.auth.type', 'org.apache.iceberg.gcp.auth.GoogleAuthManager') \ .config(f'spark.sql.catalog.{catalog_name}.io-impl', 'org.apache.iceberg.gcp.gcs.GCSFileIO') \ .config('spark.sql.extensions', 'org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions') \ .getOrCreate()
Ersetzen Sie RUNTIME_VERSION wie im Beispiel für die vereinfachte Konfiguration weiter oben auf diesem Tab beschrieben.
Ersetzen Sie WAREHOUSE_PATH durch den Pfad zu Ihrem Data Warehouse. Verwenden Sie für Kataloge mit mehreren Buckets (empfohlen) bl://projects/PROJECT_ID/catalogs/CATALOG_ID.
Verwenden Sie für Kataloge mit einem Bucket gs://CLOUD_STORAGE_BUCKET_NAME.
Mit Bereitstellung von Anmeldedaten konfigurieren
Wenn Sie die Bereitstellung von Anmeldedaten verwenden möchten, müssen Sie einen Katalog im Bereitstellungsmodus für Anmeldedaten verwenden und den X-Iceberg-Access-Delegation-Header mit dem Wert vended-credentials zu Iceberg-REST-Kataloganfragen hinzufügen. Fügen Sie dazu die folgende Zeile zum Sitzungs-Builder hinzu:
.config(f'spark.sql.catalog.{catalog_name}.header.X-Iceberg-Access-Delegation', 'vended-credentials')
Im folgenden Beispiel wird eine Sitzung mit Credential Vending erstellt:
from google.cloud.dataproc_spark_connect import DataprocSparkSession from google.cloud.dataproc_v1 import Session catalog_name = "CATALOG_NAME" session_config = Session() session_config.runtime_config.version = 'RUNTIME_VERSION' spark = DataprocSparkSession.builder.appName("APP_NAME") \ .dataprocSessionConfig(session_config) \ .config('spark.sql.defaultCatalog', catalog_name) \ .config(f'spark.sql.catalog.{catalog_name}', 'org.apache.iceberg.spark.SparkCatalog') \ .config(f'spark.sql.catalog.{catalog_name}.type', 'rest') \ .config(f'spark.sql.catalog.{catalog_name}.uri', 'https://biglake.googleapis.com/iceberg/v1/restcatalog') \ .config(f'spark.sql.catalog.{catalog_name}.warehouse', 'WAREHOUSE_PATH') \ .config(f'spark.sql.catalog.{catalog_name}.header.x-goog-user-project', 'PROJECT_ID') \ .config(f'spark.sql.catalog.{catalog_name}.rest.auth.type', 'org.apache.iceberg.gcp.auth.GoogleAuthManager') \ .config(f'spark.sql.catalog.{catalog_name}.io-impl', 'org.apache.iceberg.gcp.gcs.GCSFileIO') \ .config(f'spark.sql.catalog.{catalog_name}.header.X-Iceberg-Access-Delegation', 'vended-credentials') \ .config('spark.sql.extensions', 'org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions') \ .getOrCreate()
Bei der vereinfachten Konfiguration wird dieser Header hinzugefügt, wenn der Katalog den Modus für die Bereitstellung von Anmeldedaten verwendet. Weitere Informationen finden Sie in der Iceberg-Dokumentation im Abschnitt
Header in RESTCatalog.
Daten mit Spark SQL verwalten
Nachdem Sie die Spark-Sitzung konfiguriert haben, verwenden Sie Spark SQL, um Datenverwaltungsvorgänge auszuführen.
Katalog festlegen:Mit der Eigenschaft dataproc.lakehouse.catalog. wird der Katalog bei Spark registriert, aber nicht zum Standardkatalog gemacht. In den Beispielen im vorherigen Abschnitt wird spark.sql.defaultCatalog (spark:spark.sql.defaultCatalog in einem Cluster) festgelegt, damit Sie nicht qualifizierte Tabellennamen verwenden können. Wenn Sie dieses Attribut weglassen, müssen Sie Tabellennamen mit dem Katalognamen qualifizieren, z. B. CATALOG_NAME.NAMESPACE_NAME.base_table.
Namespace erstellen Im Iceberg-REST-Katalog des Lakehouse-Laufzeitkatalogs entspricht ein Namespace einem BigQuery-Dataset.
spark.sql("CREATE NAMESPACE IF NOT EXISTS NAMESPACE_NAME") spark.sql("USE NAMESPACE_NAME")Ersetzen Sie
NAMESPACE_NAMEdurch den Namen Ihres Namespace, z. B.spark_lakehouse.Erstellen Sie eine Basistabelle im Iceberg-Format und fügen Sie Daten ein.
spark.sql("DROP TABLE IF EXISTS base_table PURGE") spark.sql("CREATE TABLE base_table (id LONG) USING iceberg") spark.sql("INSERT INTO base_table VALUES 0, 1, 2, 3, 4") spark.sql("SELECT * FROM base_table").show()Die Ausgabe sieht etwa so aus:
+---+ | id| +---+ | 0| | 1| | 2| | 3| | 4| +---+Erstellen Sie eine weitere Tabelle für neue Daten.
spark.sql("DROP TABLE IF EXISTS newdata PURGE") spark.sql("CREATE TABLE newdata(id LONG) USING iceberg") spark.sql("INSERT INTO newdata VALUES 3, 4, 5, 6") spark.sql("SELECT * FROM newdata").show()Die Ausgabe sieht etwa so aus:
+---+ | id| +---+ | 3| | 4| | 5| | 6| +---+Führen Sie die neuen Daten mit der Basistabelle zusammen.
spark.sql("""MERGE INTO base_table USING newdata ON base_table.id = newdata.id WHEN MATCHED THEN UPDATE SET base_table.id = newdata.id WHEN NOT MATCHED THEN INSERT * """) spark.sql("SELECT * FROM base_table").show()Die Ausgabe sieht etwa so aus:
+---+ | id| +---+ | 0| | 1| | 2| | 3| | 4| | 5| | 6| +---+Datensätze in der Basistabelle aktualisieren.
spark.sql( "UPDATE base_table SET id = (id + 100) WHERE (id % 2 == 0)" ) spark.sql("SELECT * FROM base_table").show()Die Ausgabe sieht etwa so aus:
+---+ | id| +---+ | 3| |104| | 5| |106| |100| |102| | 1| +---+Löschen Sie Datensätze aus der Basistabelle.
spark.sql("DELETE FROM base_table WHERE (id % 2 == 0)") spark.sql("SELECT * FROM base_table").show()Die Ausgabe sieht etwa so aus:
+---+ | id| +---+ | 3| | 5| | 1| +---+
Historischen Snapshot abfragen
Eine frühere Version einer Tabelle abrufen, indem Sie eine Snapshot-ID abfragen. Dieser Vorgang wird auch als Zeitreise bezeichnet.
Rufen Sie die Snapshot-ID der Tabellenversion vor den Vorgängen
MERGE,UPDATEundDELETEab.snapshot_ids = spark.sql( "SELECT snapshot_id FROM `NAMESPACE_NAME`.`base_table`.snapshots" ).collect() oldest_snapshot_id = snapshot_ids[1]["snapshot_id"]Ersetzen Sie
NAMESPACE_NAMEdurch den von Ihnen erstellten Namespace.Fragen Sie die Tabelle mit der abgerufenen Snapshot-ID ab.
df = ( spark.read.format("iceberg") .option("versionAsOf", oldest_snapshot_id) .load("base_table") ) df.show()Die Ausgabe zeigt den Status der Tabelle nach dem
MERGE-Vorgang, aber vor denUPDATE- oderDELETE-Vorgängen.+---+ | id| +---+ | 0| | 1| | 2| | 3| | 4| | 5| | 6| +---+
Data Lineage ermitteln
Mit Managed Service for Apache Spark 2.2 und höheren Image-Versionen können Sie die Datenbewegung zwischen Iceberg REST-Katalogtabellen des Lakehouse-Laufzeitkatalogs mit der Datenherkunft verfolgen.
Beispiel für die Datenherkunft
Erstellen Sie Iceberg-Quell- und ‑Zieltabellen und kopieren Sie dann die Daten.
spark.sql("DROP TABLE IF EXISTS source_table PURGE") spark.sql("DROP TABLE IF EXISTS target_table PURGE") spark.sql("CREATE TABLE source_table (id LONG) USING iceberg") spark.sql("""CREATE TABLE target_table USING ICEBERG AS SELECT max(id) as top_id FROM source_table """)Rufen Sie in der Google Cloud Console die Seite Knowledge Catalog Suchen auf.
Suchen Sie nach einer der Tabellen und klicken Sie dann auf den Tab
Lineage:
Beispiel für ein Datenherkunftsdiagramm auf der Knowledge Catalog-Seite in der Google Cloud Console. Die Datenherkunft erkennt sowohl die logische (Lakehouse-Laufzeitkatalogtabelle) als auch die physische (Cloud Storage) Darstellung von Lakehouse-Laufzeitkatalogtabellen im Iceberg-REST-Katalog.
Bekannte Probleme bei der Datenherkunft
In einigen Managed Service for Apache Spark-Clustern wird die vollständige Datenherkunft möglicherweise nicht aufgrund eines Problems mit der OpenLineage-Bibliothek generiert. Dies ist eine bekannte Einschränkung. Wenn sich dies auf Ihre Arbeitslasten auswirkt, wenden Sie sich an den Google Cloud-Support.
Nächste Schritte
- Weitere Informationen zum Lakehouse-Laufzeitkatalog (Iceberg-REST-Katalog)
- Föderierte Kataloge mit Spark abfragen
- Funktionen von Apache Iceberg kennenlernen
- Iceberg-Daten aus dem Lakehouse-Laufzeitkatalog abfragen
- Weitere Informationen zur Datenherkunft und zu Managed Service for Apache Spark