Integrer OneLake med Azure Databricks

Denne artikel viser, hvordan man får adgang til OneLake-data fra Azure Databricks. Begge tilgange bruger service principal-autentificering og OneLake ABFS-endpointet. Vælg den sektion, der matcher din Databricks-beregningstype:

  • Standard eller jobklynge: Brug Spark ABFS-driveren med OAuth-konfiguration til at læse og skrive data direkte gennem Spark DataFrames.
  • Serverløs compute: Serverløse runtime-systemer tillader ikke, at du sætter brugerdefinerede Spark-konfigurationsegenskaber. Brug i stedet Microsoft Authentication Library (MSAL) og biblioteket Python deltalake til at autentificere og læse eller skrive Delta-tabeller.

For relaterede Databricks-integrationsscenarier, se følgende ressourcer:

Scenarie Dokumentation
Forespørg OneLake-data fra Unity Catalog uden at kopiere dem Aktiver OneLake katalogføderation
Få adgang til Databricks Unity Catalog-data fra Fabric Spejling af Azure Databricks Unity-katalog

Forudsætninger

Før du forbinder, skal du sikre dig, at du har:

  • Et stofarbejdsområde og søhus.
  • Et Premium Azure Databricks-arbejdsområde.
  • En serviceprincipal med mindst tildelingen af bidragyder-arbejdsområdet .
  • Databricks hemmeligheder eller Azure Key Vault (AKV) til at gemme og hente hemmeligheder. Eksemplerne i denne artikel bruger Databricks hemmeligheder.

Forbind til OneLake med en standardklynge

Brug det korrekte OneLake ABFS-stiformat

Brug et af følgende URI-formater:

  • 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 bruge ID'er eller navne. Hvis du bruger navne, så undgå specialtegn og mellemrum i arbejdsområde- og søhusnavne.

Brug service principal-autentificering

Brug denne mulighed til automatiserede jobs og centraliseret hemmelig 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"
)

Forbind til OneLake med serverløs compute

Databricks serverløse compute lader dig køre arbejdsbelastninger uden at provisionere en klynge, men den tillader kun et delmængde af understøttede Spark-egenskaber. Du kan ikke sætte Spark-konfigurationen, der fs.azure.* bruges på standardklynger.

Notat

Denne begrænsning er ikke unik for Azure Databricks. Databricks serverløse implementeringer på Amazon Web Services (AWS) og Google Cloud har samme adfærd.

Hvis du forsøger at sætte en ikke-understøttet Spark-konfiguration i en serverløs notebook, returnerer systemet en CONFIG_NOT_AVAILABLE fejl.

Skærmbillede, der viser fejlmeddelelse, hvis en bruger forsøger at ændre ikke-understøttet Spark-konfiguration i serveruafhængig beregning.

Brug i stedet MSAL til at erhverve en OAuth-token og biblioteket Python deltalake til at læse eller skrive Delta-tabeller med det token.

Opsæt en serverløs notebook

  1. Opret en notesbog i dit Databricks-arbejdsområde og tilknyt den til serverløs compute.

    Skærmbillede, der viser, hvordan du opretter forbindelse mellem Databricks-notesbog og serveruafhængig beregning.

  2. Importer Python-moduler. I dette eksempel bruges to moduler:

    • msal autentificerer med Microsoft-identitetsplatform.
    • deltalake læser og skriver Delta Lake-tabeller med Python.
    from msal import ConfidentialClientApplication
    from deltalake import DeltaTable, write_deltalake
    
  3. Erklære variabler for Microsoft Entra-lejer, herunder program-id. Brug lejer-id'et for den lejer, hvor Microsoft Fabric er installeret.

    # 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. Deklarer variabler for arbejdsområde i struktur.

    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. Initialiser klienten for at erhverve 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-tabel fra 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-tabel til 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"}
    )
    

Designovervejelser

  • Brug ét writer-mønster pr. tabelsti, hvor det er muligt. At skrive til de samme lagerstier fra flere beregningsmotorer eller runtime-versioner kan forårsage konflikter.
  • Brug secrets management til service principal-legitimationer.
  • Brug OneLake-genveje , når du har brug for virtualiseret adgang, i stedet for fysisk at skrive data ind i en anden lakehouse-lokation.