Integrera OneLake med Azure Databricks

Den här artikeln visar hur du kommer åt OneLake-data från Azure Databricks. Båda metoderna använder autentisering genom tjänstens huvudkonto och OneLake ABFS-slutpunkten. Välj det avsnitt som matchar databricks-beräkningstypen:

  • Standard- eller jobbkluster: Använd Spark ABFS-drivrutinen med OAuth-konfigurationen för att läsa och skriva data direkt via Spark DataFrames.
  • Serverlös beräkning: Med serverlösa körningar kan du inte ange anpassade Spark-konfigurationsegenskaper. Använd i stället Microsofts autentiseringsbibliotek (MSAL) och biblioteket Python deltalake för att autentisera och läsa eller skriva Delta-tabeller.

Relaterade Databricks-integreringsscenarier finns i följande resurser:

Scenario Documentation
Fråga OneLake-data från Unity Catalog utan att kopiera dem Aktivera OneLake-katalogfederation
Få åtkomst till Databricks Unity-katalogdata från Fabric Spegling av Azure Databricks Unity-katalog

Förutsättningar

Innan du ansluter, se till att du har:

  • En Fabric-arbetsyta och lakehouse.
  • En premiumarbetsyta för Azure Databricks.
  • Ett tjänsthuvudnamn med minst rolltilldelningen Deltagare på arbetsytan.
  • Databricks-hemligheter eller Azure Key Vault (AKV) för att lagra och hämta hemligheter. Exemplen i den här artikeln använder Databricks-hemligheter.

Ansluta till OneLake med ett standardkluster

Använd rätt OneLake ABFS-sökvägsformat

Använd något av följande URI-format:

  • 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>

Du kan använda ID:t eller namnen. Om du använder namn bör du undvika specialtecken och blanksteg i arbetsytornas och lakehouse namn.

Använda autentisering med tjänsthuvudnamn

Använd det här alternativet för automatiserade jobb och centraliserad hemlig rotation.

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

Ansluta till OneLake med serverlös beräkning

Med databricks serverlös beräkning kan du köra arbetsbelastningar utan att etablera ett kluster, men det tillåter bara en delmängd av Spark-egenskaper som stöds. Du kan inte ange den fs.azure.* Spark-konfiguration som används i standardkluster.

Anmärkning

Den här begränsningen är inte unik för Azure Databricks. Databricks serverlösa implementeringar på Amazon Web Services (AWS) och Google Cloud har samma beteende.

Om du försöker ange en Spark-konfiguration som inte stöds i en serverlös notebook-fil returnerar systemet ett CONFIG_NOT_AVAILABLE fel.

Skärmbild som visar felmeddelande om en användare försöker ändra Spark-konfiguration som inte stöds i serverlös beräkning.

Använd i stället MSAL för att hämta en OAuth-token och biblioteket Python deltalake för att läsa eller skriva Delta-tabeller med den token.

Konfigurera en serverlös anteckningsbok

  1. Skapa en notebook-fil på databricks-arbetsytan och koppla den till serverlös beräkning.

    Skärmbild som visar hur du ansluter Databricks Notebook med serverlös beräkning.

  2. Importera Python-moduler. I det här exemplet använder du två moduler:

    • msal autentiserar med Microsofts identitetsplattform.
    • deltalake läser och skriver Delta Lake-tabeller med Python.
    from msal import ConfidentialClientApplication
    from deltalake import DeltaTable, write_deltalake
    
  3. Deklarera variabler för Microsoft Entra-klientorganisationen, inklusive program-ID. Använd klientorganisations-ID:t för klientorganisationen där Microsoft Fabric distribueras.

    # 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. Deklarera Fabric-arbeitsytevariabler.

    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. Initiera klienten för att få token.

    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. Läs en Delta-tabell från OneLake.

    dt = DeltaTable(onelake_uri, storage_options={"bearer_token": f"{token_val}", "use_fabric_endpoint": "true"})
    df = dt.to_pandas()
    print(df.head())
    
  7. Skriv en Delta-tabell till 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"}
    )
    

Designöverväganden

  • Använd ett skrivmönster per tabellsökväg där det är möjligt. Att skriva till samma lagringssökvägar från flera beräkningsmotorer eller körningsversioner kan orsaka konflikter.
  • Använd hantering av hemligheter för autentiseringsuppgifter för tjänstens huvudnamn.
  • Använd OneLake-genvägar när du behöver virtualiserad åtkomst i stället för att fysiskt skriva data till en annan lakehouse-plats.