Integrar o OneLake com o Azure Databricks

Este artigo mostra como aceder a dados OneLake de Azure Databricks. Ambas as abordagens utilizam a autenticação do serviço principal e o endpoint OneLake ABFS. Escolha a secção que corresponda ao seu tipo de computação Databricks:

  • Standard ou cluster de tarefas: Use o driver ABFS do Spark com configuração OAuth para ler e gravar dados diretamente com o Spark DataFrames.
  • Computação serverless: Ambientes de execução serverless não permitem definir propriedades de configuração personalizadas do Spark. Em vez disso, use a Biblioteca de Autenticação da Microsoft (MSAL) e a biblioteca Python deltalake para autenticar e ler ou escrever tabelas Delta.

Para cenários relacionados com integração com Databricks, consulte os seguintes recursos:

Scenario Documentação
Consultar dados OneLake do Unity Catalog sem os copiar Ativar a federação do catálogo OneLake
Aceda aos dados do Catálogo Unity do Databricks a partir do Fabric Espelhando o catálogo do Azure Databricks Unity

Pré-requisitos

Antes de ligar, certifique-se de que tem:

  • Um espaço de trabalho Fabric e um lakehouse.
  • Um espaço de trabalho premium do Azure Databricks.
  • Um principal de serviço com pelo menos a atribuição de função de Contribuidor do workspace.
  • Databricks secrets ou Azure Key Vault (AKV) para armazenar e recuperar segredos. Os exemplos neste artigo usam os segredos do Databrick.

Liga-te ao OneLake com um cluster padrão

Use o formato correto do caminho ABFS do OneLake

Use um dos seguintes formatos URI:

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

Podes usar IDs ou nomes. Se usares nomes, evita caracteres especiais e espaços em branco nos nomes dos espaços de trabalho e das casas do lago.

Usar autenticação de entidade de serviço

Use esta opção para trabalhos automatizados e rotação centralizada de segredos.

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

Liga-te ao OneLake com computação serverless

A computação serverless do Databricks permite executar cargas de trabalho sem provisionar um cluster, mas só permite um subconjunto das propriedades Spark suportadas. Não podes definir a fs.azure.* configuração do Spark usada em clusters padrão.

Observação

Essa limitação não é exclusiva do Azure Databricks. As implementações serverless do Databricks na Amazon Web Services (AWS) e Google Cloud apresentam o mesmo comportamento.

Se tentar definir uma configuração Spark não suportada num portátil serverless, o sistema devolve um erro de CONFIG_NOT_AVAILABLE.

Captura de tela mostrando a mensagem de erro se um usuário tentar modificar a configuração do Spark não suportada na computação sem servidor.

Em vez disso, use MSAL para adquirir um token OAuth e a biblioteca Python deltalake para ler ou escrever tabelas Delta com esse token.

Configura um caderno serverless

  1. Crie um caderno no seu espaço de trabalho Databricks e anexe-o à computação serverless.

    Captura de tela mostrando como conectar o notebook Databricks à computação sem servidor.

  2. Importar módulos em Python. Neste exemplo, use dois módulos:

    • msal autentica-se com o plataforma de identidades da Microsoft.
    • deltalake lê e escreve tabelas Delta Lake com Python.
    from msal import ConfidentialClientApplication
    from deltalake import DeltaTable, write_deltalake
    
  3. Declare variáveis para o tenante do Microsoft Entra, incluindo a ID da aplicação. Use a ID do locatário onde o Microsoft Fabric está implantado.

    # 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. Declarar variáveis do espaço de trabalho 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. Inicializar o cliente para obtenção de um 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ê uma tabela Delta do OneLake.

    dt = DeltaTable(onelake_uri, storage_options={"bearer_token": f"{token_val}", "use_fabric_endpoint": "true"})
    df = dt.to_pandas()
    print(df.head())
    
  7. Escreve uma tabela Delta para o 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"}
    )
    

Considerações de design

  • Use um padrão de escritor por percurso de tabela sempre que possível. Escrever nos mesmos caminhos de armazenamento a partir de múltiplos motores de computação ou versões em tempo de execução pode causar conflitos.
  • Use a gestão de segredos para credenciais de principal de serviço.
  • Use os OneLake atalhos quando precisar de acesso virtualizado em vez de escrever fisicamente dados noutra localização do lakehouse.