Durchsetzen von Datenschutzrichtlinien bei der Abfrage von Apache Iceberg™-Tabellen von Apache Spark™¶
In diesem Thema wird beschrieben, wie Sie die für Apache Iceberg™-Tabellen festgelegten Datenschutzrichtlinien durchsetzen können, wenn über Apache Spark™ mittels Snowflake Horizon Catalog zugegriffen wird. Um Datenschutzrichtlinien durchzusetzen, installieren Sie den Snowflake-Konnektor für Spark, Spark-Konnektor. Weitere Informationen über den Spark-Konnektor finden Sie unter Snowflake-Konnektor für Spark.
Der Spark-Konnektor unterstützt das Abfragen von Tabellen, die durch Snowflake-Richtlinien geschützt sind, indem er die Abfrage über Snowflake weiterleitet, was eine effiziente Nutzung der Datenverarbeitung und eine konsistente Durchsetzung gewährleistet. Der Spark-Konnektor unterstützt auch das Ausführen von Schreiboperationen auf Tabellen, die durch Snowflake-Richtlinien geschützt sind, indem das Schreiben über Snowflake geroutet wird.
Bemerkung
Der Spark-Konnektor unterstützt auch die direkte Abfrage von Apache Iceberg-Tabellen ohne fein abgestufte Datenschutzrichtlinien, indem Spark-Sitzungs-Computing über Snowflake Horizon Catalog verwendet wird.
Workflow zur Durchsetzung von Datenschutzrichtlinien bei der Abfrage von Iceberg-Tabellen aus Spark¶
Um die Datenschutzrichtlinien bei der Abfrage von Iceberg-Tabellen aus Spark durchzusetzen, führen Sie die folgenden Schritte aus:
Verbinden von Spark mit Snowflake-Konnektor für Spark mit Iceberg-Tabellen, was das Herunterladen des Snowflake-Konnektors für Spark und das Verbinden von Spark mit Iceberg-Tabellen über Snowflake Horizon Catalog beinhaltet.
Unterstützte Datenschutzrichtlinien¶
Die folgenden Datenschutzrichtlinien werden unterstützt:
Abfragen für Tabellen, die durch eine andere Datenrichtlinie geschützt sind, führen zu einem Fehler.
Voraussetzungen¶
Rufen Sie die folgenden Informationen ab:
Der Benutzername des Snowflake-Benutzers, der die Tabellen abfragen wird
Der Name der Snowflake-Datenbank, die die Tabellen enthält, die Sie abfragen möchten
Der Name des virtuellen Warehouse in Snowflake, das für die Evaluation der Richtlinien verwendet werden soll
Rufen Sie den Kontobezeichner für Ihr Snowflake-Konto ab, das die abzufragenden Iceberg-Tabellen enthält. Eine Anweisung dazu finden Sie unter Kontobezeichner. Sie geben diesen Bezeichner an, wenn Sie Spark mit Iceberg-Tabellen unter Verwendung von Datenzugriffsrichtlinien verbinden.
Tipp
Um Ihren Kontobezeichner mit SQL abzurufen, können Sie den folgenden Befehl ausführen:
SELECT CURRENT_ORGANIZATION_NAME() || '-' || CURRENT_ACCOUNT_NAME();
Schritt 1: Konfigurieren von Datenschutzrichtlinien¶
Wichtig
Wenn Sie bereits Datenschutzrichtlinien für die Iceberg-Tabellen festgelegt haben, die Sie abfragen möchten, fahren Sie mit dem nächsten Schritt fort.
In diesem Schritt konfigurieren Sie die Datenschutzrichtlinien.
Um Datenschutzrichtlinien zu konfigurieren, legen Sie Datenzugriffsrichtlinien für die Iceberg-Tabellen fest, die Sie abfragen möchten:
Weitere Informationen zum Zuweisen von Maskierungsrichtlinien finden Sie unter Grundlegendes zur dynamischen Datenmaskierung.
Weitere Informationen zum Zuweisen von Tag-basierten Maskierungsrichtlinien finden Sie unter Tag-basierte Maskierungsrichtlinien.
Weitere Informationen zum Zuweisen von Zeilenzugriffsrichtlinien finden Sie unter Erläuterungen zu Zeilenzugriffsrichtlinien.
Schritt 2: Verbinden von Spark mit dem Snowflake-Konnektor für Spark mit Iceberg-Tabellen¶
In diesem Schritt verbinden Sie Spark über Horizon Catalog mit Iceberg-Tabellen. Mit dieser Verbindung können Sie die Tabellen mithilfe von Spark mit den für die Tabellen durchgesetzten Datenschutzrichtlinien abfragen.
Um Spark mit dem Snowflake-Konnektor für Spark (Spark-Konnektor) mit Iceberg-Tabellen zu verbinden, laden Sie zunächst den Spark-Konnektor herunter und verbinden dann Spark mit Iceberg-Tabellen.
Snowflake-Konnektor für Spark herunterladen¶
Um 3.1.6 oder eine neuere Version des Snowflake-Konnektors für Spark herunterzuladen, folgen Sie den Anweisungen unter Installieren und Konfigurieren des Spark-Konnektors.
Spark mit Iceberg-Tabellen verbinden¶
In diesem Schritt verbinden Sie Spark über Horizon Catalog mit Iceberg-Tabellen. Diese Verbindung enthält Konfigurationen für die Verwendung des Snowflake-Konnektors für Spark mit Horizon Catalog, um die Tabellen abzufragen, die durch Snowflake-Datenschutzrichtlinien geschützt sind.
Bemerkung
Wenn Sie externes OAuth oder eine Schlüsselpaar-Authentifizierung verwenden, lesen Sie Verbinden von Spark mit Iceberg-Tabellen über externes OAuth oder Schlüsselpaar-Authentifizierung.
Um Spark mit Iceberg-Tabellen über ein programmgesteuertes Zugriffstoken (PAT) zu verbinden, verwenden Sie den folgenden Beispiel-PySpark-Code:
from pyspark.sql import SparkSession # Snowflake Horizon Catalog Configuration, change as per your environment CATALOG_URI = "https://<account_identifier>.snowflakecomputing.com/polaris/api/catalog" ROLE = "<role>" HORIZON_SESSION_ROLE = f"session:role:{ROLE}" CATALOG_NAME = "<database_name>" #provide in UPPER CASE SF_URL= "<account_identifier>.snowflakecomputing.com" SF_USER = "<user_name>" #provide in UPPER CASE SF_PASSWORD = "<user_password>" SF_SCHEMA = "<schema_name>" #provide in UPPER CASE SF_WAREHOUSE = "<warehouse_name>" #provide in UPPER CASE # Cloud Service Provider Region Configuration (where the Iceberg data is stored) REGION = "<region_name>" # Paste the External Oauth Access token that you generated in Snowflake here ACCESS_TOKEN = "<your_access_token>" # Paste the PAT you generated in Snowflake here PAT_TOKEN = "<your_PAT_token>" # Iceberg Version ICEBERG_VERSION = "1.9.1" #Snowflake Connector for Spark DRIVER_VERSION = "3.24.0" # (or above) SNOWFLAKE_CONNECTOR_VERSION = "3.1.6" try: spark.stop() except: pass spark = ( SparkSession.builder .master("local[*]") .config("spark.ui.port", "0") .config("spark.driver.bindAddress", "127.0.0.1") .config("spark.driver.host", "127.0.0.1") .config("spark.driver.port", "0") .config("spark.blockManager.port", "0") # JAR Dependencies for Iceberg, Azure and Snowflake Connector for Spark .config( "spark.jars.packages", f"org.apache.iceberg:iceberg-spark-runtime-3.5_2.12:{ICEBERG_VERSION}," f"org.apache.iceberg:iceberg-aws-bundle:{ICEBERG_VERSION}," # for Azure storage, use the below package and comment above azure bundle # f"org.apache.iceberg:iceberg-azure-bundle:{ICEBERG_VERSION}" # for Snowflake Connector for Spark f"net.snowflake:snowflake-jdbc:{DRIVER_VERSION}," f"net.snowflake:spark-snowflake_2.12:{SNOWFLAKE_CONNECTOR_VERSION}" ) # Iceberg SQL Extensions .config("spark.sql.extensions", "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions") .config("spark.sql.defaultCatalog", "horizoncatalog") .config("spark.sql.catalog.horizoncatalog", "org.apache.spark.sql.snowflake.catalog.SnowflakeFallbackCatalog") #Horizon REST Catalog Configuration .config(f"spark.sql.catalog.horizoncatalog.catalog-impl", "org.apache.iceberg.spark.SparkCatalog") .config(f"spark.sql.catalog.horizoncatalog.type", "rest") .config(f"spark.sql.catalog.horizoncatalog.uri", CATALOG_URI) .config(f"spark.sql.catalog.horizoncatalog.warehouse", CATALOG_NAME) .config(f"spark.sql.catalog.horizoncatalog.scope", HORIZON_SESSION_ROLE) .config(f"spark.sql.catalog.horizoncatalog.client.region", REGION) .config(f"spark.sql.catalog.horizoncatalog.credential", PAT_TOKEN) # for External Oauth use below and comment above configuration .token #.config(f"spark.sql.catalog.horizoncatalog.token", ACCESS_TOKEN) .config("spark.sql.catalog.horizoncatalog.io-impl","org.apache.iceberg.aws.s3.S3FileIO") # Enforcing policies using Snowflake Connector for Spark .config("spark.snowflake.sfURL", SF_URL) .config("spark.snowflake.sfUser", SF_USER) .config("spark.snowflake.sfPassword", SF_PASSWORD) # for External Oauth uncomment below and comment above configurations for user and password #.config("spark.snowflake.sfAuthenticator","oauth") #.config("spark.snowflake.sfToken",ACCESS_TOKEN) .config("spark.snowflake.sfDatabase", CATALOG_NAME) .config("spark.snowflake.sfSchema",SF_SCHEMA) # Optional .config("spark.snowflake.sfRole",ROLE) .config("spark.snowflake.sfWarehouse",SF_WAREHOUSE) # Required for vended credentials .config(f"spark.sql.catalog.horizoncatalog.header.X-Iceberg-Access-Delegation", "vended-credentials") .config("spark.sql.iceberg.vectorization.enabled", "false") .getOrCreate() ) spark.sparkContext.setLogLevel("ERROR")
Wobei:
<account_identifier>ist Ihr Snowflake-Kontobezeichner für das Snowflake-Konto, das die Iceberg-Tabellen enthält, die Sie abfragen möchten. Wie Sie diesen Bezeichner finden, erfahren Sie unter Kontobezeichner.<your_access_token>ist Ihr -Zugriffstoken, das Sie erhalten haben. Um ein Zugriffstoken zu erhalten, siehe Zugriffstoken für die Authentifizierung besorgen.Bemerkung
Für External OAuth können Sie auch Ihre Verbindung zur Engine mit automatischer Tokenaktualisierung konfigurieren, anstatt ein Zugriffstoken anzugeben.
<database_name>ist der Name der Datenbank in Ihrem Snowflake-Konto, die von Snowflake verwaltete Iceberg-Tabellen enthält, die Sie abfragen möchten.Bemerkung
Die folgenden Eigenschaften in Spark erwarten Ihren Snowflake-Datenbanknamen, nicht den Namen Ihres Snowflake-Warehouses:
.warehouse.sfDatabase
<role>ist die Rolle in Snowflake, die mit Zugriff auf die Iceberg-Tabellen konfiguriert ist, die Sie abfragen möchten. Beispiel: DATA_ENGINEER.<user_name>ist der Benutzername, der für den Zugriff auf Tabellen in Snowflake verwendet wird.<user_password>ist das Kennwort für den Benutzer, der auf die Tabellen zugreift.Bemerkung
Dieses Kennwort kann das programmgesteuerte Zugriffstoken (PAT) sein, das Sie ggf. zur Authentifizierung erhalten haben.
<schema_name>ist das Schema in Snowflake, in dem die Tabellen gespeichert sind. Dies ist optional.<warehouse_name>ist der Name des Snowflake-Warehouses (der Computeinstanz), das für die Auswertung von Richtlinien verwendet werden soll.
Wichtig
Standardmäßig ist das Codebeispiel für Apache Iceberg™-Tabellen eingerichtet, die auf Amazon S3 gespeichert sind. Wenn Ihre Iceberg-Tabellen auf Azure Storage (ADLS) gespeichert sind, führen Sie die folgenden Schritte aus:
Versehen Sie die folgende Zeile mit Kommentarmarkierungen:
f"org.apache.iceberg:iceberg-aws-bundle:{ICEBERG_VERSION}"Entfernen Sie die Kommentarmarkierungen in der folgenden Zeile:
# f"org.apache.iceberg:iceberg-azure-bundle:{ICEBERG_VERSION}"
Verbinden von Spark mit Iceberg-Tabellen über externes OAuth oder Schlüsselpaar-Authentifizierung¶
Das vorherige Codebeispiel zeigt die Konfiguration für die Verbindung mithilfe eines programmgesteuerten Zugriffstokens (PAT).
Um Spark mithilfe von externem OAuth oder Schlüsselpaar-Authentifizierung mit Iceberg-Tabellen zu verbinden, befolgen Sie diesen Schritten, um das vorherige Codebeispiel zu ändern:
Für
<your_access_token>geben Sie Ihr Zugriffstoken für externes OAuth oder die Schlüsselpaar-Authentifizierung an.Um ein Zugriffstoken zu erhalten, siehe Schritt 3: Zugriffstoken für die Authentifizierung besorgen.
Versehen Sie die folgende Zeile mit Kommentarmarkierungen:
.config(f"spark.sql.catalog.{CATALOG_NAME}.credential", PAT_TOKEN)Entfernen Sie die Kommentarmarkierungen in der folgenden Zeile:
#.config(f"spark.sql.catalog.{CATALOG_NAME}.token", ACCESS_TOKEN)
Schritt 3: Abfragen von Iceberg-Tabellen mit Spark¶
Verwenden Sie Spark, um Iceberg-Tabellen zu lesen, die durch Snowflake-Datenschutzrichtlinien geschützt sind. Spark kann Abfragen von Tabellen, die durch Snowflake-Richtlinien geschützt sind, automatisch über Snowflake weiterleiten, um eine konsistente Durchsetzung sicherzustellen.
Eine Tabelle abfragen¶
spark.sql("SHOW NAMESPACES").show(truncate=False)
spark.sql("USE horizoncatalog.<schema_name>")
spark.sql("SHOW TABLES").show(truncate=False)
spark.sql("Select * from <your_table_name_in_snowflake>").show(truncate=False)
Überwachen einer Abfrage zur Evaluation von Richtlinien¶
Um die Abfrageaktivität in Snowflake für Abfragen zu überwachen, die zur Richtlinienevaluierung von Spark an Snowflake weitergeleitet werden, können Sie die Abfrageaktivität in Ihrem Snowflake-Konto überwachen.
Um den Abfrageverlauf in Snowflake zu überwachen, folgen Sie den Anweisungen unter Abfrageaktivität mit Abfrageverlauf überwachen.
Hinweise zur Konfiguration von Datenschutzrichtlinien¶
Beachten Sie bei der Konfiguration von Datenschutzrichtlinien die folgenden Punkte:
Die Durchsetzung von Datenschutzrichtlinien für Iceberg-Tabellen, die Sie mit Spark abfragen, wird nur unterstützt, wenn die folgenden Datenschutzrichtlinien für die Tabellen festgelegt sind:
Maskierungsrichtlinien
Tag-basierte Maskierungsrichtlinien
Zeilenzugriffsrichtlinien
Abfragen für Tabellen, die durch alle anderen Richtlinien geschützt sind, führen zu einem Fehler.