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:

  1. Konfigurieren von Datenschutzrichtlinien.

  2. 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.

  3. Abfragen der Iceberg-Tabellen.

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();
    
    Copy

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.

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")
    
    Copy

    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:

    1. Versehen Sie die folgende Zeile mit Kommentarmarkierungen: f"org.apache.iceberg:iceberg-aws-bundle:{ICEBERG_VERSION}"

    2. 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:

  1. 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.

  2. Versehen Sie die folgende Zeile mit Kommentarmarkierungen: .config(f"spark.sql.catalog.{CATALOG_NAME}.credential", PAT_TOKEN)

  3. 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)
Copy

Ü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.

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.