Eine Dienstverbindung registrieren

Hier erfahren Sie, wie Sie die Anmeldeinformationen für die Verbindung Ihres Dienstes mit Snowflake oder dem Dienst eines Drittanbieters (z. B. Apache Spark™) registrieren. Der Snowflake Open Catalog-Administrator registriert eine Dienstverbindung.

Der Beispielcode in diesem Thema zeigt, wie eine Dienstverbindung in Spark registriert wird, und der Beispielcode ist in PySpark.

Voraussetzungen

Bevor Sie eine Dienstverbindung registrieren können, müssen Sie eine Dienstverbindung konfigurieren. Anweisungen finden Sie unter Konfigurieren Sie eine Dienstverbindung .

Eine Dienstverbindung registrieren

Der folgende Beispielcode bezieht sich auf die Registrierung einer einzelnen Dienstverbindung.

Hinweis

Sie können auch mehrere Dienstverbindungen registrieren; siehe Beispiel 2: Zwei Dienstverbindungen registrieren.

import pyspark
from pyspark.sql import SparkSession

spark = SparkSession.builder.appName('iceberg_lab') \
    .config('spark.jars.packages', 'org.apache.iceberg:iceberg-spark-runtime-3.5_2.12:1.4.1,<maven_coordinate>') \
    .config('spark.sql.extensions', 'org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions') \
    .config('spark.sql.defaultCatalog', 'opencatalog') \
    .config('spark.sql.catalog.opencatalog', 'org.apache.iceberg.spark.SparkCatalog') \
    .config('spark.sql.catalog.opencatalog.type', 'rest') \
    .config('spark.sql.catalog.opencatalog.uri','https://<open_catalog_account_identifier>.snowflakecomputing.com/polaris/api/catalog') \
    .config('spark.sql.catalog.opencatalog.header.X-Iceberg-Access-Delegation','vended-credentials') \
    .config('spark.sql.catalog.opencatalog.credential','<client_id>:<client_secret>') \
    .config('spark.sql.catalog.opencatalog.warehouse','<catalog_name>') \
    .config('spark.sql.catalog.opencatalog.scope','PRINCIPAL_ROLE:<principal_role_name>') \
    .getOrCreate()
Copy

Parameter

Parameter

Beschreibung

<catalog_name>

Gibt den Namen des Katalogs an, mit dem eine Verbindung hergestellt werden soll.

Wichtig:
<catalog_name> unterscheidet Groß- und Kleinschreibung.

<maven_coordinate>

Gibt die Maven-Koordinate für Ihren externen Anbieter von Cloud Speicher an:

  • S3: software.amazon.awssdk:bundle:2.20.160
  • Cloud Storage (von Google): org.apache.iceberg:iceberg-gcp-bundle:1.5.2
  • Azure: org.apache.iceberg:iceberg-azure-bundle:1.5.2

<client_id>

Gibt den Client ID an, den der Dienstprinzipal verwenden soll.

<client_secret>

Gibt das Client-Geheimnis an, das der Dienstprinzipal verwenden soll.

<open_catalog_account_identifier>

Gibt den Kontobezeichner für Ihr Open Catalog-Konto an. Je nach Region und Cloud-Plattform für das Konto kann dieser Bezeichner der Kontobezeichner selbst sein (zum Beispiel xy12345) oder zusätzliche Segmente enthalten. Weitere Informationen finden Sie unter Einen Kontobezeichner als Bezeichner verwenden.

<principal_role_name>

Gibt die Hauptrolle an, die dem Dienstprinzipal gewährt wird.

Registrieren einer regionenübergreifenden Dienstverbindung (nur Amazon S3)

Der folgende Beispielcode dient zur Registrierung einer Dienstverbindung, wenn Folgendes zutrifft:

  • Ihr Open Catalog-Konto wird auf Amazon S3 gehostet.

  • Ihr externer Speicheranbieter ist Amazon S3.

  • Ihr Open Catalog-Konto wird in einer S3-Region gehostet, die sich von der S3-Region unterscheidet, in der sich der Speicher Bucket mit Ihren Apache Iceberg™-Tabellen befindet.

import pyspark
from pyspark.sql import SparkSession

spark = SparkSession.builder.appName('iceberg_lab') \
    .config('spark.jars.packages', 'org.apache.iceberg:iceberg-spark-runtime-3.5_2.12:1.4.1,software.amazon.awssdk:bundle:2.20.160') \
    .config('spark.sql.extensions', 'org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions') \
    .config('spark.sql.defaultCatalog', 'opencatalog') \
    .config('spark.sql.catalog.opencatalog', 'org.apache.iceberg.spark.SparkCatalog') \
    .config('spark.sql.catalog.opencatalog.type', 'rest') \
    .config('spark.sql.catalog.opencatalog.uri','https://<open_catalog_account_identifier>.snowflakecomputing.com/polaris/api/catalog') \
    .config('spark.sql.catalog.opencatalog.header.X-Iceberg-Access-Delegation','vended-credentials') \
    .config('spark.sql.catalog.opencatalog.credential','<client_id>:<client_secret>') \
    .config('spark.sql.catalog.opencatalog.warehouse','<catalog_name>') \
    .config('spark.sql.catalog.opencatalog.client.region','<target_s3_region>') \
    .config('spark.sql.catalog.opencatalog.scope','PRINCIPAL_ROLE:<principal_role_name>') \
    .getOrCreate()
Copy

Parameter

Parameter

Beschreibung

<catalog_name>

Gibt den Namen des Katalogs an, mit dem eine Verbindung hergestellt werden soll.

Wichtig:
<catalog_name> unterscheidet Groß- und Kleinschreibung.

<client_id>

Gibt den Client ID an, den der Dienstprinzipal verwenden soll.

<client_secret>

Gibt das Client-Geheimnis an, das der Dienstprinzipal verwenden soll.

<open_catalog_account_identifier>

Gibt den Kontobezeichner für Ihr Open Catalog-Konto an. Je nach Region und Cloud-Plattform für das Konto kann dieser Bezeichner der Kontobezeichner selbst sein (zum Beispiel xy12345) oder zusätzliche Segmente enthalten. Weitere Informationen finden Sie unter Einen Kontobezeichner als Bezeichner verwenden.

<target_s3_region>

Gibt den Code der Region an, in der sich der S3 Bucket befindet, der Ihre Apache Iceberg-Tabellen enthält. Die Codes der Regionen finden Sie unter AWS Dienstendpunkte und in der Spalte „Region“ in der Tabelle.

<principal_role_name>

Gibt die Hauptrolle an, die dem Dienstprinzipal gewährt wird.

Beispiele

Dieser Abschnitt enthält Beispiele für die Registrierung einer Dienstverbindung in Spark.

Beispiel 1: Registrieren einer einzelnen Dienstverbindung (S3)

import pyspark
from pyspark.sql import SparkSession

spark = SparkSession.builder.appName('iceberg_lab') \
    .config('spark.jars.packages', 'org.apache.iceberg:iceberg-spark-runtime-3.5_2.12:1.4.1,software.amazon.awssdk:bundle:2.20.160') \
    .config('spark.sql.extensions', 'org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions') \
    .config('spark.sql.defaultCatalog', 'opencatalog') \
    .config('spark.sql.catalog.opencatalog', 'org.apache.iceberg.spark.SparkCatalog') \
    .config('spark.sql.catalog.opencatalog.type', 'rest') \
    .config('spark.sql.catalog.opencatalog.uri','https://ab12345.snowflakecomputing.com/polaris/api/catalog') \
    .config('spark.sql.catalog.opencatalog.header.X-Iceberg-Access-Delegation','vended-credentials') \
    .config('spark.sql.catalog.opencatalog.credential','000000000000000000000000000=:1111111111111111111111111111111111111111111=') \
    .config('spark.sql.catalog.opencatalog.warehouse','Catalog1') \
    .config('spark.sql.catalog.opencatalog.scope','PRINCIPAL_ROLE:data_engineer') \
    .getOrCreate()
Copy

Beispiel 2: Registrieren von zwei Dienstverbindungen (S3)

Wichtig

Wenn Sie mehrere Dienstverbindungen registrieren, müssen Sie die opencatalog-Instanzen im Code für die erste Verbindung in eindeutigen Text im Code für jede weitere Verbindung ändern. Im folgenden Code werden zum Beispiel die Instanzen opencatalog für die erste Verbindung in opencatalog1 für die zweite Verbindung geändert:

import pyspark
from pyspark.sql import SparkSession

spark = SparkSession.builder.appName('iceberg_lab') \
    .config('spark.jars.packages', 'org.apache.iceberg:iceberg-spark-runtime-3.5_2.12:1.4.1,software.amazon.awssdk:bundle:2.20.160') \
    .config('spark.sql.extensions', 'org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions') \
    .config('spark.sql.defaultCatalog', 'opencatalog') \
    .config('spark.sql.catalog.opencatalog', 'org.apache.iceberg.spark.SparkCatalog') \
    .config('spark.sql.catalog.opencatalog.type', 'rest') \
    .config('spark.sql.catalog.opencatalog.uri','https://ab12345.snowflakecomputing.com/polaris/api/catalog') \
    .config('spark.sql.catalog.opencatalog.header.X-Iceberg-Access-Delegation','vended-credentials') \
    .config('spark.sql.catalog.opencatalog.credential','000000000000000000000000000=:1111111111111111111111111111111111111111111=') \
    .config('spark.sql.catalog.opencatalog.warehouse','Catalog1') \
    .config('spark.sql.catalog.opencatalog.scope','PRINCIPAL_ROLE:data_scientist') \
    .config('spark.sql.catalog.opencatalog1', 'org.apache.iceberg.spark.SparkCatalog') \
    .config('spark.sql.catalog.opencatalog1.type', 'rest') \
    .config('spark.sql.catalog.opencatalog1.uri','https://ab12345.snowflakecomputing.com/polaris/api/catalog') \
    .config('spark.sql.catalog.opencatalog1.header.X-Iceberg-Access-Delegation','vended-credentials') \
    .config('spark.sql.catalog.opencatalog1.credential','222222222222222222222222222=:3333333333333333333333333333333333333333333=') \
    .config('spark.sql.catalog.opencatalog1.warehouse','Catalog2') \
    .config('spark.sql.catalog.opencatalog1.scope','PRINCIPAL_ROLE:data_scientist') \
    .getOrCreate()
Copy

Beispiel 3: Registrieren einer einzelnen Dienstverbindung (Cloud Storage von Google)

import pyspark
from pyspark.sql import SparkSession

spark = SparkSession.builder.appName('iceberg_lab') \
    .config('spark.jars.packages', 'org.apache.iceberg:iceberg-spark-runtime-3.5_2.12:1.4.1,org.apache.iceberg:iceberg-gcp-bundle:1.5.2') \
    .config('spark.sql.extensions', 'org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions') \
    .config('spark.sql.defaultCatalog', 'opencatalog') \
    .config('spark.sql.catalog.opencatalog', 'org.apache.iceberg.spark.SparkCatalog') \
    .config('spark.sql.catalog.opencatalog.type', 'rest') \
    .config('spark.sql.catalog.opencatalog.uri','https://ab12345.snowflakecomputing.com/polaris/api/catalog') \
    .config('spark.sql.catalog.opencatalog.header.X-Iceberg-Access-Delegation','vended-credentials') \
    .config('spark.sql.catalog.opencatalog.credential','000000000000000000000000000=:1111111111111111111111111111111111111111111=') \
    .config('spark.sql.catalog.opencatalog.warehouse','Catalog1') \
    .config('spark.sql.catalog.opencatalog.scope','PRINCIPAL_ROLE:data_engineer') \
    .getOrCreate()
Copy

Beispiel 4: Registrieren einer einzelnen Dienstverbindung (Azure)

import pyspark
from pyspark.sql import SparkSession

spark = SparkSession.builder.appName('iceberg_lab') \
    .config('spark.jars.packages', 'org.apache.iceberg:iceberg-spark-runtime-3.5_2.12:1.4.1,org.apache.iceberg:iceberg-azure-bundle:1.5.2') \
    .config('spark.sql.extensions', 'org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions') \
    .config('spark.sql.defaultCatalog', 'opencatalog') \
    .config('spark.sql.catalog.opencatalog', 'org.apache.iceberg.spark.SparkCatalog') \
    .config('spark.sql.catalog.opencatalog.type', 'rest') \
    .config('spark.sql.catalog.opencatalog.uri','https://ab12345.snowflakecomputing.com/polaris/api/catalog') \
    .config('spark.sql.catalog.opencatalog.header.X-Iceberg-Access-Delegation','vended-credentials') \
    .config('spark.sql.catalog.opencatalog.credential','000000000000000000000000000=:1111111111111111111111111111111111111111111=') \
    .config('spark.sql.catalog.opencatalog.warehouse','Catalog1') \
    .config('spark.sql.catalog.opencatalog.scope','PRINCIPAL_ROLE:data_engineer') \
    .getOrCreate()
Copy

Überprüfen Sie die Verbindung zu Open Catalog

Um zu überprüfen, ob Spark mit Open Catalog verbunden ist, listen Sie die Namespaces für den Katalog auf. Weitere Informationen finden Sie unter Namespaces auflisten.