Integrieren von OneLake in Azure Databricks

In diesem Artikel wird erläutert, wie Sie auf OneLake-Daten aus Azure Databricks zugreifen. Beide Ansätze verwenden die Dienstprinzipalauthentifizierung und den OneLake ABFS-Endpunkt. Wählen Sie den Abschnitt aus, der Ihrem Databricks-Computetyp entspricht:

  • Standard- oder Auftragscluster: Verwenden Sie den Spark ABFS-Treiber mit OAuth-Konfiguration, um Daten direkt über Spark DataFrames zu lesen und zu schreiben.
  • Serverlose Berechnung: Serverlose Laufzeiten ermöglichen es Ihnen nicht, benutzerdefinierte Spark-Konfigurationseigenschaften festzulegen. Verwenden Sie stattdessen die Microsoft Authentication Library (MSAL) (MSAL) und die Python deltalake-Bibliothek, um Delta-Tabellen zu authentifizieren und zu lesen oder zu schreiben.

Verwandte Databricks-Integrationsszenarien finden Sie in den folgenden Ressourcen:

Szenario Dokumentation
Abfragen von OneLake-Daten aus dem Unity-Katalog ohne Kopieren Aktivieren des OneLake-Katalogverbunds
Zugriff auf Databricks Unity Catalog-Daten aus Fabric Spiegelung des Azure Databricks Unity-Katalogs

Voraussetzungen

Bevor Sie eine Verbindung herstellen, stellen Sie sicher, dass Sie folgendes haben:

  • Ein Fabric-Arbeitsbereich und seehaus.
  • Ein Azure Databricks-Premium-Arbeitsbereich.
  • Ein Dienstprinzipal mit mindestens der Rollenzuweisung des Arbeitsbereichs "Mitwirkender ".
  • Databricks-Secrets oder Azure Key Vault (AKV) zum Speichern und Abrufen von Secrets. In den Beispielen in diesem Artikel werden Databricks-Geheimnisse verwendet.

Mit einem Standardcluster eine Verbindung zu OneLake herstellen

Verwenden des richtigen OneLake-ABFS-Pfadformats

Verwenden Sie eines der folgenden URI-Formate:

  • abfss://<workspace_id_or_name>@onelake.dfs.fabric.microsoft.com/<lakehouse_id_or_name>.lakehouse/Files/<path>
  • abfss://<workspace_id_or_name>@onelake.dfs.fabric.microsoft.com/<lakehouse_id_or_name>.lakehouse/Tables/<path>

Sie können IDs oder Namen verwenden. Wenn Sie Namen verwenden, vermeiden Sie Sonderzeichen und Leerzeichen in Arbeitsbereichs- und Seehausnamen.

Verwenden Sie die Dienstprinzipalauthentifizierung

Verwenden Sie diese Option für automatisierte Aufträge und zentralisierte Geheimnisschlüsselrotation.

workspace_name = "<workspace_name>"
lakehouse_name = "<lakehouse_name>"
tenant_id = dbutils.secrets.get(scope="<scope-name>", key="<tenant-id-key>")
service_principal_id = dbutils.secrets.get(scope="<scope-name>", key="<client-id-key>")
service_principal_secret = dbutils.secrets.get(scope="<scope-name>", key="<client-secret-key>")

spark.conf.set("fs.azure.account.auth.type", "OAuth")
spark.conf.set(
   "fs.azure.account.oauth.provider.type",
   "org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider",
)
spark.conf.set("fs.azure.account.oauth2.client.id", service_principal_id)
spark.conf.set("fs.azure.account.oauth2.client.secret", service_principal_secret)
spark.conf.set(
   "fs.azure.account.oauth2.client.endpoint",
   f"https://login.microsoftonline.com/{tenant_id}/oauth2/token",
)

# Read
df = spark.read.format("parquet").load(
   f"abfss://{workspace_name}@onelake.dfs.fabric.microsoft.com/{lakehouse_name}.lakehouse/Files/data"
)
df.show(10)

# Write
df.write.format("delta").mode("overwrite").save(
   f"abfss://{workspace_name}@onelake.dfs.fabric.microsoft.com/{lakehouse_name}.lakehouse/Tables/dbx_delta_spn"
)

Herstellen einer Verbindung zu OneLake mit serverlosem Rechnen.

Databricks Serverless Compute ermöglicht es Ihnen, Workloads ohne Bereitstellung eines Clusters auszuführen, wobei jedoch nur eine Teilmenge der unterstützten Spark-Eigenschaften erlaubt ist. In Standardclustern können Sie die fs.azure.* verwendete Spark-Konfiguration nicht festlegen.

Hinweis

Diese Einschränkung gilt nicht nur für Azure Databricks. Databricks serverlose Implementierungen auf Amazon Web Services (AWS) und Google Cloud haben das gleiche Verhalten.

Wenn Sie versuchen, eine nicht unterstützte Spark-Konfiguration in einem serverlosen Notizbuch festzulegen, gibt das System einen CONFIG_NOT_AVAILABLE Fehler zurück.

Screenshot mit fehlermeldung, wenn ein Benutzer versucht, nicht unterstützte Spark config in serverless compute zu ändern.

Verwenden Sie stattdessen MSAL, um ein OAuth-Token und die Python deltalake-Bibliothek abzurufen, um Delta-Tabellen mit diesem Token zu lesen oder zu schreiben.

Einrichten eines serverlosen Notizbuchs

  1. Erstellen Sie ein Notizbuch in Ihrem Databricks-Arbeitsbereich, und schließen Sie es an die serverlose Rechenleistung an.

    Screenshot, der zeigt, wie Sie das Databricks-Notizbuch mit serverloser Berechnung verbinden.

  2. Importieren sie Python Module. Verwenden Sie in diesem Beispiel zwei Module:

    • msal authentifiziert sich beim Microsoft Identity Platform.
    • deltalake liest und schreibt Delta Lake-Tabellen mit Python.
    from msal import ConfidentialClientApplication
    from deltalake import DeltaTable, write_deltalake
    
  3. Deklarieren Sie Variablen für den Microsoft Entra-Mandanten einschließlich Anwendungs-ID. Verwenden Sie die Mandanten-ID des Mandanten, in dem Microsoft Fabric bereitgestellt wird.

    # Fetch from Databricks secrets.
    tenant_id = dbutils.secrets.get(scope="<replace-scope-name>",key="<replace value with key value for tenant_id>")
    client_id = dbutils.secrets.get(scope="<replace-scope-name>",key="<replace value with key value for client_id>")
    client_secret = dbutils.secrets.get(scope="<replace-scope-name>",key="<replace value with key value for secret>")
    
  4. Deklarieren Sie Fabric-Arbeitsbereichsvariablen.

    workspace_id = "<replace with workspace name>"
    lakehouse_id = "<replace with lakehouse name>"
    table_to_read = "<name of lakehouse table to read>"
    onelake_uri = f"abfss://{workspace_id}@onelake.dfs.fabric.microsoft.com/{lakehouse_id}.lakehouse/Tables/{table_to_read}"
    
  5. Initialisieren Sie den Client, um ein Token abzurufen.

    authority = f"https://login.microsoftonline.com/{tenant_id}"
    
    app = ConfidentialClientApplication(
        client_id,
        authority=authority,
        client_credential=client_secret
    )
    
    result = app.acquire_token_for_client(scopes=["https://onelake.fabric.microsoft.com/.default"])
    
    if "access_token" in result:
        print("Access token acquired.")
        token_val = result['access_token']
    else:
        raise Exception(f"Failed to acquire token: {result.get('error_description', result)}")
    
  6. Lesen Sie eine Delta-Tabelle aus OneLake.

    dt = DeltaTable(onelake_uri, storage_options={"bearer_token": f"{token_val}", "use_fabric_endpoint": "true"})
    df = dt.to_pandas()
    print(df.head())
    
  7. Schreiben Sie eine Delta-Tabelle in OneLake.

    target_uri = f"abfss://{workspace_id}@onelake.dfs.fabric.microsoft.com/{lakehouse_id}.lakehouse/Tables/<target_table_name>"
    write_deltalake(
        target_uri,
        df,
        mode="overwrite",
        storage_options={"bearer_token": f"{token_val}", "use_fabric_endpoint": "true"}
    )
    

Überlegungen zum Entwurf

  • Verwenden Sie nach Möglichkeit ein Writer-Muster pro Tabellenpfad. Das Schreiben in dieselben Speicherpfade aus mehreren Rechenmodulen oder Laufzeitversionen kann zu Konflikten führen.
  • Verwenden Sie die Geheimnisverwaltung für Anmeldeinformationen von Dienstprinzipalen.
  • Verwenden Sie OneLake-Tastenkombinationen , wenn Sie virtualisierten Zugriff benötigen, anstatt Daten physisch an einen anderen Seehausstandort zu schreiben.