OneLake integreren met Azure Databricks

In dit artikel wordt beschreven hoe u toegang hebt tot OneLake-gegevens uit Azure Databricks. Beide benaderingen maken gebruik van service-principalverificatie en het OneLake ABFS-eindpunt. Kies de sectie die overeenkomt met uw Databricks-rekentype:

  • Standaardcluster of taakcluster: gebruik het Spark ABFS-stuurprogramma met OAuth-configuratie om gegevens rechtstreeks te lezen en te schrijven via Spark DataFrames.
  • Serverloze rekenkracht: met serverloze runtimes kunt u geen aangepaste Spark-configuratie-eigenschappen instellen. Gebruik in plaats daarvan de Microsoft Authentication Library (MSAL) en de bibliotheek Python deltalake om Delta-tabellen te verifiëren en lezen of schrijven.

Zie de volgende resources voor gerelateerde Databricks-integratiescenario's:

Scenario Documentatie
Een query uitvoeren op OneLake-gegevens uit Unity Catalog zonder deze te kopiëren Federatie van OneLake-catalogus inschakelen
Databricks Unity Catalog-gegevens openen vanuit Fabric Spiegelen van de Azure Databricks Unity Catalog
Schrijf naar OneLake door een externe locatie in de Unity Catalog te gebruiken Direct schrijven naar OneLake

Vereiste voorwaarden

Voordat u verbinding maakt, moet u ervoor zorgen dat u het volgende hebt:

  • Een Fabric-werkruimte en Lakehouse.
  • Een premium Azure Databricks-werkruimte.
  • Een service-principal met ten minste de roltoewijzing Bijdrager werkruimte.
  • Databricks-geheimen of Azure Key Vault (AKV) voor het opslaan en ophalen van geheimen. In de voorbeelden in dit artikel worden Databricks-geheimen gebruikt.

Verbinding maken met OneLake met een standaardcluster

De juiste OneLake ABFS-padindeling gebruiken

Gebruik een van de volgende URI-indelingen:

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

U kunt id's of namen gebruiken. Als u namen gebruikt, vermijdt u speciale tekens en witruimte in werkruimte- en lakehouse-namen.

Gebruik serviceprincipal-verificatie

Gebruik deze optie voor geautomatiseerde taken en gecentraliseerde geheimrotatie.

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

Maak verbinding met OneLake met serverloze rekenkracht

Met serverloze compute van Databricks kunt u workloads uitvoeren zonder een cluster in te richten, maar er is alleen een subset van ondersteunde Spark-eigenschappen toegestaan. U kunt de fs.azure.* Spark-configuratie die wordt gebruikt op standaardclusters niet instellen.

Opmerking

Deze beperking is niet uniek voor Azure Databricks. Serverloze databricks-implementaties op Amazon Web Services (AWS) en Google Cloud hebben hetzelfde gedrag.

Als u probeert een niet-ondersteunde Spark-configuratie in te stellen in een serverloze notebook, retourneert het systeem een CONFIG_NOT_AVAILABLE fout.

Schermopname van het foutbericht als een gebruiker probeert de niet-ondersteunde Spark-configuratie in serverloze berekeningen te wijzigen.

Gebruik in plaats daarvan MSAL om een OAuth-token en de Python deltalake-bibliotheek te verkrijgen om Delta-tabellen met dat token te lezen of te schrijven.

Een serverloos notebook instellen

  1. Maak een notebook in uw Databricks-werkruimte en koppel dit aan serverloze berekeningen.

    Schermopname die laat zien hoe u een Databricks-notebook verbindt met serverloze berekeningen.

  2. Importeer Python modules. Gebruik in dit voorbeeld twee modules:

    • msal wordt geverifieerd bij de Microsoft identity platform.
    • deltalake leest en schrijft Delta Lake-tabellen met Python.
    from msal import ConfidentialClientApplication
    from deltalake import DeltaTable, write_deltalake
    
  3. Declareer variabelen voor Microsoft Entra-tenant, inclusief toepassings-id. Gebruik de tenant-id van de tenant waar Fabric is geïmplementeerd.

    # 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. Declareer werkruimtevariabelen voor Fabric.

    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. Initialiseer de client om een token te verkrijgen.

    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. Lees een Delta-tabel uit OneLake.

    dt = DeltaTable(onelake_uri, storage_options={"bearer_token": f"{token_val}", "use_fabric_endpoint": "true"})
    df = dt.to_pandas()
    print(df.head())
    
  7. Schrijf een Delta-tabel naar 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"}
    )
    

Ontwerpoverwegingen

  • Gebruik waar mogelijk één schrijfpatroon per tabelpad. Schrijven naar dezelfde opslagpaden vanuit meerdere rekenprogramma's of runtimeversies kan conflicten veroorzaken.
  • Geheimenbeheer gebruiken voor service-principalreferenties.
  • Gebruik OneLake-snelkoppelingen wanneer u gevirtualiseerde toegang nodig hebt in plaats van fysiek gegevens te schrijven naar een andere lakehouse-locatie.
  • Om de toegang tot het publieke netwerk tot OneLake te beperken, voeg je de resource-ID van je Databricks-toegangsconnector toe aan de Resource Instance Rules van de werkruimte, zodat OneLake zijn beheerde identiteit bij elk verzoek kan verifiëren.