Integración de OneLake con Azure Databricks

En este artículo se muestra cómo acceder a los datos de OneLake desde Azure Databricks. Ambos enfoques usan la autenticación de entidad de servicio y el punto de conexión de ABFS de OneLake. Elija la sección que coincida con el tipo de proceso de Databricks:

  • Clúster estándar o de trabajo: use el controlador ABFS de Spark con la configuración de OAuth para leer y escribir datos directamente a través de DataFrames de Spark.
  • Proceso sin servidor: los entornos de ejecución sin servidor no permiten establecer propiedades de configuración personalizadas de Spark. En su lugar, use el Biblioteca de autenticación de Microsoft (MSAL) y la biblioteca de Python deltalake para autenticar y leer o escribir tablas Delta.

Para ver los escenarios de integración de Databricks relacionados, consulte los siguientes recursos:

Escenario Documentación
Consulta de datos de OneLake desde el catálogo de Unity sin copiarlos Habilitar la federación del catálogo de OneLake
Acceso a los datos del catálogo de Databricks Unity desde Fabric Creación de reflejo del catálogo de Unity de Azure Databricks

Prerrequisitos

Antes de conectarse, asegúrese de que tiene:

  • Un área de trabajo de Fabric y lakehouse.
  • Un área de trabajo premium de Azure Databricks.
  • Una entidad de servicio con al menos el rol asignado en el área de trabajo Colaborador.
  • Secretos de Databricks o Azure Key Vault (AKV) para almacenar y recuperar secretos. En los ejemplos de este artículo se usan secretos de Databricks.

Conexión a OneLake con un clúster estándar

Utilice el formato correcto de ruta de acceso de OneLake ABFS

Use uno de los siguientes formatos de 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>

Puede usar identificadores o nombres. Si usa nombres, evite caracteres especiales y espacios en blanco en los nombres de área de trabajo y lakehouse.

Uso de la autenticación de entidad de servicio

Use esta opción para trabajos automatizados y rotación de secretos centralizada.

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

Conéctate a OneLake con computación sin servidor

El proceso sin servidor de Databricks permite ejecutar cargas de trabajo sin aprovisionar un clúster, pero solo permite un subconjunto de propiedades de Spark admitidas. No se puede establecer la fs.azure.* configuración de Spark que se usa en clústeres estándar.

Nota:

Esta limitación no es exclusiva de Azure Databricks. Las implementaciones sin servidor de Databricks en Amazon Web Services (AWS) y Google Cloud tienen el mismo comportamiento.

Si intenta establecer una configuración de Spark no admitida en un cuaderno sin servidor, el sistema devuelve un error CONFIG_NOT_AVAILABLE.

Captura de pantalla que muestra el mensaje de error si un usuario intenta modificar la configuración de Spark no admitida en proceso sin servidor.

En su lugar, use MSAL para adquirir un token de OAuth y la biblioteca de Python deltalake para leer o escribir tablas Delta con ese token.

Configuración de un cuaderno sin servidor

  1. Crea un notebook en tu entorno de trabajo de Databricks y adjúntalo al proceso sin servidor.

    Captura de pantalla que muestra cómo conectar el cuaderno de Databricks con proceso sin servidor.

  2. Importar módulos de Python. En este ejemplo, use dos módulos:

    • msal se autentica en la plataforma de identidad de Microsoft.
    • deltalake lee y escribe tablas de Delta Lake con Python.
    from msal import ConfidentialClientApplication
    from deltalake import DeltaTable, write_deltalake
    
  3. Declarar variables para la instancia de Microsoft Entra que incluye el identificador de la aplicación. Use el identificador de inquilino del inquilino donde se implementa Microsoft Fabric.

    # 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 variables de área de trabajo de 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. Inicialice el cliente para adquirir el 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. Lee una tabla Delta de OneLake.

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

Consideraciones sobre diseño

  • Utiliza un patrón de escritura por ruta de tabla siempre que sea posible. Escribir en las mismas rutas de acceso de almacenamiento desde varios motores de proceso o versiones en tiempo de ejecución puede provocar conflictos.
  • Use la administración de secretos para las credenciales del servicio principal.
  • Utilice accesos directos de OneLake cuando necesite acceso virtualizado en vez de escribir datos físicamente en otra ubicación de lakehouse.