Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Aprenda a configurar Microsoft Dynamics 365 como origen de datos para la ingesta en Azure Databricks mediante Lakeflow Connect.
Nota:
Esta página cubre el flujo de trabajo de exportación de CSV, que no utiliza un espacio de trabajo de Azure Synapse Analytics. Para exportar como tablas Delta en formato Parquet usando un espacio de trabajo Azure Synapse Analytics, consulte Configurar una fuente de datos Parquet para la ingestión de Microsoft Dynamics 365. Databricks recomienda el flujo de trabajo Parquet para instancias grandes o de alto volumen porque ofrece mejor rendimiento y estabilidad a gran escala.
Para obtener información sobre cómo el conector accede a los datos de origen, consulte ¿Cómo accede el conector a los datos D365?. Para obtener una lista de las aplicaciones de Dataverse admitidas, consulte ¿Qué aplicaciones de Dynamics 365 se admiten?.
Prerrequisitos
Antes de configurar el origen de datos de Dynamics 365, debe tener:
- Una suscripción de Azure activa con permisos para crear recursos.
- Un entorno de Microsoft Dynamics 365 con acceso de administrador.
- Un entorno de Dataverse asociado a la instancia de Dynamics 365.
- Permisos de administrador del área de trabajo o administrador de metastore en Azure Databricks.
- Permisos para crear y configurar Azure Synapse Link en el entorno de Dataverse.
- Una suscripción a Azure con una cuenta de almacenamiento que no esté ya vinculada a otro perfil de Synapse Link. No puedes añadir tablas de Dataverse a una cuenta de almacenamiento vinculada a otro perfil; debes crear un nuevo perfil en Synapse Link.
- Una cuenta de almacenamiento de ADLS Gen2 (o permisos para crear una).
- Permisos para crear y configurar aplicaciones de Microsoft Entra ID.
- Dataverse API v9.2 o posterior.
- API REST de Azure Storage, versión 2021-08-06.
- Azure Synapse Link para Dataverse versión 1.0 o posterior.
Configuración de entidades virtuales o tablas directas (opcional)
Las entidades virtuales y las tablas directas hacen datos de orígenes que no son de Dataverse (como Dynamics 365 Finance y Operaciones) disponibles en Dataverse sin copiar los datos. Para orígenes que no son de Dataverse, debe configurar entidades virtuales o tablas directas antes de configurar Azure Synapse Link.
Para configurar entidades virtuales:
En Power Apps, vaya a la página Entornos y haga clic en Aplicaciones de Dynamics 365.
Para vincular entidades de F&O como entidades virtuales en Dataverse, instale la solución Finance and Operations Virtual Entity .
Configure la autorización de servicio a servicio (S2S) entre Dataverse y su aplicación de F&O. Esto permite que Dataverse se comunique con la aplicación. Para obtener más información, consulte la documentación de Microsoft Configuración de entidades virtuales de Dataverse.
Para cada entidad virtual que quiera ingerir, habilite Seguimiento de cambios en Propiedades avanzadas.
De forma predeterminada, la solución entidad virtual de F&O expone algunas entidades virtuales de forma predeterminada en la lista de tablas de Dataverse. Sin embargo, puede exponer entidades adicionales manualmente:
- Vaya a la página Configuración avanzada del entorno de Dataverse.
- Haga clic en el icono de filtro de la parte superior derecha para acceder a la búsqueda avanzada.
- Seleccione Entidades de finanzas y operaciones disponibles en el menú desplegable y, a continuación, haga clic en Resultados.
- Seleccione la entidad virtual que desea exponer.
- En la página Administrador de entidades, cambie Visible a True y, a continuación, haga clic en Guardar y cerrar.
Ahora puede ver la entidad en la lista de tablas de Dataverse con un nombre que comienza por mserp_.
Importante
Las entidades virtuales y las tablas directas aparecen en Azure Synapse Link solo después de que Dataverse termina de sincronizarlas. Esto suele tardar hasta 15 minutos, pero puede tardar hasta 30. Si faltan tablas tras 30 minutos, véase Entidades virtuales que no aparecen en el descubrimiento de esquemas.
Configuración de Azure Synapse Link
En este paso, utilizará el enlace de Synapse de Dataverse a Azure Data Lake para seleccionar las tablas que desea importar. Este servicio reemplaza al servicio anteriormente conocido como Exportar datos a Azure Data Lake Storage Gen2. A pesar del nombre, no utiliza ni depende de Azure Synapse Analytics. Es un servicio de exportación continua de Dataverse a ADLS Gen2.
En el Portal de Power Apps , haga clic en Analizar y, a continuación, en Vincular a Azure Synapse.
Haga clic en Nuevo vínculo. Dataverse rellena automáticamente tus suscripciones activas desde el mismo tenant. Seleccione la suscripción adecuada en la lista desplegable.
No active la casilla Conectar al área de trabajo de Azure Synapse Analytics . Los datos aterrizan directamente como CSV en tu cuenta de almacenamiento ADLS Gen2, y este flujo de trabajo no requiere un espacio de trabajo de Azure Synapse Analytics.
En la página De creación de vínculos de Synapse, haga clic en Avanzadas. A continuación, active Mostrar opciones de configuración avanzadas.
Active la opción Habilitar estructura de carpetas de actualización incremental y establezca el intervalo de actualización deseado para el enlace de Synapse. El mínimo es de 5 minutos. Este intervalo se aplica a todas las tablas incluidas en este enlace Synapse. (Establecerás un horario para tu pipeline de Databricks en un paso independiente).
Selecciona las tablas que quieres sincronizar, dejando los ajustes de Añadir solo y Partición como predeterminados.
- Si se ingiere desde una aplicación nativa de Dataverse, seleccione las tablas de Dataverse pertinentes directamente desde la sección Dataverse .
- Si la importación se realiza desde F&O, puede seleccionar tablas directas de la sección D365 Finance & Operations o entidades virtuales de la sección Dataverse (prefijo
mserp_). Para obtener más información sobre las entidades virtuales, vea Paso 1.
Haz clic en Guardar. Comienza la sincronización inicial de Synapse Link.
Para los usuarios de F&O, esta sincronización inicial puede tardar horas en tablas grandes con cientos de gigabytes.
Nota:
Si la sincronización inicial de una entidad F&O tarda demasiado, puedes acelerarla creando un índice en la tabla de la app F&O:
- Dirígete a la tabla que deseas indexar en el entorno de F&O.
- Cree una extensión para la tabla.
- Dentro de la extensión de tabla, defina un nuevo índice.
- Añade los campos que quieras incluir en el índice, lo que acelera las búsquedas en la base de datos en esos campos.
- Guarde e implemente los cambios en su entorno de F&O.
Creación de una aplicación entra ID para la ingesta
En este paso, recopilarás la información de Entra ID necesaria para crear una conexión de Unity Catalog que admita la ingesta en Azure Databricks.
Obtén el ID de inquilino de tu inquilino de Entra ID (
portal.azure.com>>Microsoft Entra ID>>pestaña Información general>>ID de inquilino, que aparece en el panel de la derecha).Al crear una instancia de Azure Synapse Link, Azure Synapse crea un contenedor de ADLS para sincronizar las tablas seleccionadas. Busque el nombre del contenedor de ADLS visitando la página de administración del Synapse Link.
Recopile las credenciales de acceso para el contenedor de ADLS.
- Cree una Aplicación de Microsoft Entra ID, si todavía no tiene una.
- Recopile el secreto de cliente.
- Recopilar el identificador de aplicación (
portal.azure.com>>Microsoft Entra ID>>Administrar>>registros de aplicaciones).
Conceda a la aplicación Entra ID acceso al contenedor de ADLS, si aún no lo ha hecho.
Nota:
Asegúrese de que la aplicación Entra ID tenga acceso a los contenedores de ADLS asociados a cada perfil de Synapse Link. Si va a ingerir datos de varios entornos o aplicaciones, confirme que la aplicación tiene asignaciones de roles en todos los contenedores pertinentes.
- Vaya a Cuentas de Azure Storage y seleccione el contenedor o la cuenta de almacenamiento. (Azure Databricks recomienda el nivel de contenedor para mantener los privilegios mínimos).
- Haga clic en Control de acceso (IAM) y, a continuación, en Agregar asignación de roles.
- Selecciona la función de acceso Colaborador de datos de Storage Blob → Lectura/Escritura/Eliminación. Si su organización no lo permite, póngase en contacto con el equipo de la cuenta de Azure Databricks.
- Haga clic en Siguiente y, a continuación, seleccione Miembros.
- Elija Usuario, grupo o entidad de servicio, luego busque su Registro de Aplicaciones. (Si la aplicación no está presente en el resultado de la búsqueda, puede escribir explícitamente su identificador de objeto en la barra de búsqueda y, a continuación, presionar Entrar).
- Haga clic en Revisar y asignar.
- Para confirmar que los permisos están configurados correctamente, puede comprobar la Access Control del contenedor.
Crea una canalización de Dynamics 365
Puedes crear la canalización en la interfaz o a través de la API. El asistente de la interfaz gestiona la conexión y la tubería juntos, mientras que la ruta de la API los crea como dos pasos separados.
Uso de la interfaz de usuario
El asistente te pide las credenciales de aplicación Entra ID y los detalles de almacenamiento que recogiste en los pasos anteriores, y luego crea la conexión y la pipeline juntos.
- En el menú de la izquierda, haga clic en Nuevo y, a continuación, en Agregar o cargar datos.
- En la página Agregar datos , haga clic en el icono de Dynamics 365 .
- A partir de ahí, sigue las instrucciones del asistente.
Uso de la API
Crea primero la conexión y luego la tubería que la utiliza. Necesitas el nombre de la conexión del primer paso para definir la tubería en el segundo.
Paso 1: Crea una conexión con Dynamics 365
En este paso, creará una conexión de Catálogo de Unity para almacenar de forma segura las credenciales de Dynamics 365 y empezará a realizar la ingesta en Azure Databricks.
- En tu área de trabajo, haz clic en
Catálogo.
- Haga clic en
Conéctese y, a continuación, haga clic en Conexiones.
- Haga clic en el botón Crear conexión .
- Proporcione un nombre de conexión único y, a continuación, seleccione Dynamics 365 como tipo de conexión.
- Escriba el secreto de cliente y el identificador de cliente de la aplicación entra ID creada en el paso anterior. No modifique el ámbito. Haga clic en Siguiente.
- Escriba el nombre de la cuenta de Azure Storage, el identificador de inquilino y el nombre del contenedor de ADLS y, a continuación, haga clic en Crear conexión.
- Anote el nombre de la conexión.
Paso 2: Crear la tubería de ingestión
En este paso, configurarás la canalización de ingestión. Cada tabla ingerida obtiene una tabla de streaming correspondiente con el mismo nombre en el destino. Puedes usar tanto un notebook como la CI de Databricks. Ambos enfoques realizan llamadas API a un servicio de Databricks que crea la canalización.
Uso de un cuaderno
La plantilla al final de esta página define funciones auxiliares para crear y gestionar la canalización. La primera celda configura esas funciones, y la segunda es donde defines tu propio pipeline.
- Copie la plantilla de cuaderno.
- Ejecute la primera celda del cuaderno sin modificarlo.
- Modifique la segunda celda del cuaderno con los detalles de la canalización (por ejemplo, la tabla desde la que desea ingerir, donde desea almacenar los datos, etc.).
- Ejecuta la segunda celda del cuaderno de plantillas; esto ejecuta
create_pipeline. - Puede ejecutar
list_pipelinepara mostrar el identificador de canalización y sus detalles. - Puede ejecutar
edit_pipelinepara editar la definición de canalización. - Puede ejecutar
delete_pipelinepara eliminar la canalización.
Uso de la CLI de Databricks
Para crear la canalización:
databricks pipelines create --json "<pipeline_definition OR json file path>"
Para editar la canalización:
databricks pipelines update --json "<<pipeline_definition OR json file path>"
Para obtener la definición de la canalización:
databricks pipelines get "<your_pipeline_id>"
Para eliminar la canalización:
databricks pipelines delete "<your_pipeline_id>"
Para obtener más información, siempre puede ejecutar:
databricks pipelines --help
databricks pipelines <create|update|get|delete|...> --help
Configuración de características adicionales (opcional)
El conector ofrece características adicionales, como SCD tipo 2 para el seguimiento del historial, y la selección y deselección a nivel de columna. Consulte Patrones comunes para canalizaciones de ingesta administradas.
Plantilla de cuaderno
Copia ambas celdas en un cuaderno en tu espacio de trabajo. La celda 1 define las funciones auxiliares que llaman a la API de las pipelines, y la celda 2 es donde defines la pipeline que quieres crear.
Celda 1: Configuración de la API
Copia esta celda as-is y ejecutala sin cambios. Define create_pipeline, list_pipeline, edit_pipeline, delete_pipeline, y los otros ayudantes que llama al celdo 2.
# DO NOT MODIFY
# This sets up the API utils for creating managed ingestion pipelines in Databricks.
import requests
import json
notebook_context = dbutils.notebook.entry_point.getDbutils().notebook().getContext()
api_token = notebook_context.apiToken().get()
workspace_url = notebook_context.apiUrl().get()
api_url = f"{workspace_url}/api/2.0/pipelines"
headers = {
'Authorization': 'Bearer {}'.format(api_token),
'Content-Type': 'application/json'
}
def check_response(response):
if response.status_code == 200:
print("Response from API:\n{}".format(json.dumps(response.json(), indent=2, sort_keys=False)))
else:
print(f"Failed to retrieve data: error_code={response.status_code}, error_message={response.json().get('message', response.text)}")
def create_pipeline(pipeline_definition: str):
response = requests.post(url=api_url, headers=headers, data=pipeline_definition)
check_response(response)
def edit_pipeline(id: str, pipeline_definition: str):
response = requests.put(url=f"{api_url}/{id}", headers=headers, data=pipeline_definition)
check_response(response)
def delete_pipeline(id: str):
response = requests.delete(url=f"{api_url}/{id}", headers=headers)
check_response(response)
def list_pipeline(filter: str):
body = "" if len(filter) == 0 else f"""{{"filter": "{filter}"}}"""
response = requests.get(url=api_url, headers=headers, data=body)
check_response(response)
def get_pipeline(id: str):
response = requests.get(url=f"{api_url}/{id}", headers=headers)
check_response(response)
def start_pipeline(id: str, full_refresh: bool=False):
body = f"""
{{
"full_refresh": {str(full_refresh).lower()},
"validate_only": false,
"cause": "API_CALL"
}}
"""
response = requests.post(url=f"{api_url}/{id}/updates", headers=headers, data=body)
check_response(response)
def stop_pipeline(id: str):
print("cannot stop pipeline")
Celda 2: Definición de tubería
Elige una de las dos opciones que aparecen a continuación, dependiendo de cuánto de tus datos de Synapse Link quieras ingerir:
- Opción A, especificación a nivel de esquema: ingiere todas las tablas sincronizadas por tu Azure Synapse Link. Azure Databricks no recomienda más de 250 tablas por pipeline, así que si tu Synapse Link sincroniza más, divide las tablas en varias pipelines.
-
Opción B, especialización a nivel de tabla: solo ingiere las tablas que menciones. Cada
source_tablevalor debe coincidir con el nombre de la tabla en la columna de Nombre de la página de Synapse Link Manage.
Sustituye los valores provisionales por los tuyos, pero deja "channel": "PREVIEW" as-is.
# Option A: schema-level spec
pipeline_spec = """
{
"name": "<YOUR_PIPELINE_NAME>",
"ingestion_definition": {
"connection_name": "<YOUR_CONNECTION_NAME>",
"objects": [
{
"schema": {
"source_schema": "objects",
"destination_catalog": "<YOUR_DATABRICKS_CATALOG>",
"destination_schema": "<YOUR_DATABRICKS_SCHEMA>"
}
}
]
},
"channel": "PREVIEW"
}
"""
create_pipeline(pipeline_spec)
# Option B: table-level spec
pipeline_spec = """
{
"name": "<YOUR_PIPELINE_NAME>",
"ingestion_definition": {
"connection_name": "<YOUR_CONNECTION_NAME>",
"objects": [
{
"table": {
"source_schema": "objects",
"source_table": "<YOUR_F_AND_O_TABLE_NAME>",
"destination_catalog": "<YOUR_DATABRICKS_CATALOG>",
"destination_schema": "<YOUR_DATABRICKS_SCHEMA>"
}
}
]
},
"channel": "PREVIEW"
}
"""
create_pipeline(pipeline_spec)
Ejemplo: Historial de pista con SCD tipo 2
De forma predeterminada, la API usa el tipo 1 de SCD. Esto significa que sobrescribe los datos en el destino si se edita en el origen. Si prefiere conservar los datos históricos y usar el tipo SCD 2, especifique eso en la configuración. Por ejemplo:
# Schema-level spec with SCD type 2
pipeline_spec = """
{
"name": "<YOUR_PIPELINE_NAME>",
"ingestion_definition": {
"connection_name": "<YOUR_CONNECTION_NAME>",
"objects": [
{
"schema": {
"source_schema": "objects",
"destination_catalog": "<YOUR_DATABRICKS_CATALOG>",
"destination_schema": "<YOUR_DATABRICKS_SCHEMA>",
"table_configuration": {
"scd_type": "SCD_TYPE_2"
}
}
}
]
},
"channel": "PREVIEW"
}
"""
create_pipeline(pipeline_spec)
# Table-level spec with SCD type 2
pipeline_spec = """
{
"name": "<YOUR_PIPELINE_NAME>",
"ingestion_definition": {
"connection_name": "<YOUR_CONNECTION_NAME>",
"objects": [
{
"table": {
"source_schema": "objects",
"source_table": "<YOUR_F_AND_O_TABLE_NAME>",
"destination_catalog": "<YOUR_DATABRICKS_CATALOG>",
"destination_schema": "<YOUR_DATABRICKS_SCHEMA>",
"table_configuration": {
"scd_type": "SCD_TYPE_2"
}
}
}
]
},
"channel": "PREVIEW"
}
"""
create_pipeline(pipeline_spec)
Ejemplo: Incluir o excluir columnas específicas
De forma predeterminada, la API ingiere todas las columnas de la tabla seleccionada. Sin embargo, puede elegir incluir o excluir columnas específicas. Por ejemplo:
# Table spec with included and excluded columns.
pipeline_spec = """
{
"name": "<YOUR_PIPELINE_NAME>",
"ingestion_definition": {
"connection_name": "<YOUR_CONNECTON_NAME>",
"objects": [
{
"table": {
"source_schema": "objects",
"source_table": "<YOUR_F_AND_O_TABLE_NAME>",
"destination_catalog": "<YOUR_DATABRICKS_CATALOG>",
"destination_schema": "<YOUR_DATABRICKS_SCHEMA>",
"table_configuration": {
"include_columns": ["<COLUMN_A>", "<COLUMN_B>", "<COLUMN_C>"]
}
}
}
]
},
"channel": "PREVIEW"
}
"""
create_pipeline(pipeline_spec)