ETL con Azure Data Factory y Dynamics 365.

Introducción

En el mundo de las ETLs (Extracción, transformación y carga de datos) tenemos infinidad de herramientas. Específicamente para el crm Dynamics 365, la carga de datos podríamos hacerla a través de un fichero de excel o fichero de texto csv, pero también podríamos usar el viejo conocido SSIS en combinación de la herramienta de integración de KingwaySoft para Dynamics CRM.

Sin embargo en este artículo describiremos el uso de un servicio de Azure, sugerido por Microsoft para la ETL llamado Data Factory (DF).

Manos a la obra

Importemos datos a nuestro CRM:

Para realizar este ejemplo doy por hecho que tienes una suscripción de Azure con algo de crédito para trastear con sus servicios, si aún no la tienes te recomiendo crear una cuenta para ello, además necesitarás una trial de Dynamics 365 . Como fuente de datos para este ejemplo usaremos una base de datos de SQL, con algunos campos de la entidad Contactos (Nombre, apellido, correo, teléfono).

Creando el Data Factory

Seguiremos estos pasos de forma general; pero si ya tienes algo de conocimiento de Azure y de PowerShell te invito a revisar el artículo del compañero Javier Gómez Santos donde crea un DF via PowerShell y además hace uso de KeyVaults para el guardado de contraseñas.

Dentro de Azure procedemos a crear el recurso del DF, haciendo clic en Crear un recurso.

Usamos nuestra caja de búsqueda. Hacemos click en Data Factory.

Nos aparecerá la siguiente pantalla donde haremos clic en crear.

azure-03

Llenamos los campos solicitados.

Hacemos clic en crear y dejamos que Azure trabaje en la creación del recurso.

Voilá. Se ha completado la implementación.

Trabajando con el DataFactory

Completado el proceso de creación nos dirigimos al recurso, y hacemos clic en Crear y supervisar.

Se nos abrirá otra pestaña en el navegador con la ventana principal del Data Factory.

DF nos ofrece varias opciones con las que podemos trabajar:

  • Create pipeline: permite crear un flujo vacío en el que el desarrollador usará las diferentes actividades para diseñar la ETL.
  • Create data flow: crea un flujo con una actividad de transformación, usado para cambiar los datos y enviarlos a destino.
  • Create pipeline from template: ofrece flujos con actividades ya creadas y lista para ser usadas según nuestras necesidades. Si trabajas a menudo con integraciones échale un vistazo a estas plantillas, puede que alguna te sirva.
  • Configure SSIS Integration: puede que tengas un servidor solo para integraciones con SSIS, DF te permite usarlo y además aprovechar los paquetes de tus transformaciones de datos.
  • Setup code repository: DF te permite guardar el código usado para la ejecución de los flujos, transformaciones etc. en un repositorio git.
  • Copy Data: realizará un flujo de copia de forma guiada donde indicaremos la fuente y el destino de nuestros datos.

Para nuestro ejemplo haremos clic en Create Pipeline. Veremos la ventana de diseño del DF y en el menú de Activities, desplegaremos Move & Transform y arrastaremos la actividad de Copy Data.

Vemos debajo de nuestra caja de actividad que se nos muestran varias pestañas, entre ellas Source y Sink con un superíndice en rojo, indicándonos que debemos rellenar los datos que nos solicitan.

Seleccionamos la pestaña Source y hacemos clic en New, para realizar la conexión a nuestra fuente de datos.

Seleccionamos Azure SQL Database, para realizar la conexión a la base de datos que usaremos como fuente.

Se nos mostrará una ventana para crear un servicio ligado a la conexión. Hacemos clic en New.

En esta ventana debemos seleccionar suscripción, el nombre del servidor, usuario y contraseña. Rellenos los datos podemos probar la conexión y hacer clic en Create.

Una vez creado el servicio de conexión a nuestra base de datos, nos pide que indiquemos la tabla en la base de datos que queremos consultar. Aquí seleccionamos la tabla de Contactos, y aplicamos los cambios.

Hasta ahora tenemos nuestros datos de la fuente de la siguiente manera:

Vemos que nos deja por defecto seleccionada la opción Table, para este ejemplo marcaremos la opción Query y escribiremos una pequeña query para no traernos todos los datos. Aquí el ejemplo usado:

Configuremos ahora el destino, haciendo clic en la pestaña Sink.

Seleccionaremos como dataset Dynamics 365.

Clicamos en continuar. En este caso se configurará el dataset para debemos editarlo para configurar la conexión a Dynamics, para ello hacemos clic en Open.

En el menú de la izquierda están desplegados los dataset. Nótese que previamente hemos creado el dataset AzureSqlTable1 correspondiente a nuestra fuente de datos.

Aquí en la pestaña de Connection, veremos que no hay ningún servicio ligado, haremos clic en New para configurar la conexión con Dynamics 365.

Llenamos los datos que nos solicitan: dirección url de la trial de Dynamics creada, para el tipo de conexión indicamos Office365, usuario y contraseña usados en la trial, probamos conexión y hacemos click en Create.

Los datos quedarían de la siguiente manera:

Creada la conexión, nuevamente en la pestaña Connection aún dentro de nuestro dataset de Dynamics seleccionamos el nombre de la entidad de CRM que actualizaremos, en este caso Contacto. Haz click en el desplegable de Entity Name y selecciona Contacto.

Volviendo a nuestro pipeline, haciendo clic en nuestro pipeline a la izquierda, seleccionamos nuevamente la pestaña Sink.

Revisamos los datos de nuestro destino que deberían quedar de la siguiente manera:
Añadiendo un 1 al máximo de conexiones simultáneas para permitir al menos una conexión a nuestro Dynamics.

Seleccionamos ahora la pestaña mapping.

Haciendo clic en Import schemas, dejaremos que el DF haga el mapeo automáticamente, este se guiará por los nombres de las columnas, sin embargo para nuestro ejemplo crearemos el mapeo manualmente y añadiremos solo los campos usados en la query indicada en la fuente de datos quedando de la siguiente manera:

 

Al añadir los campos de forma general debemos agregar siempre el campo clave de los registros, en este caso contactid. Adicionalmente véase en la pestaña Sink que en el caso de copia con el conector de Dynamics el comportamiento de escritura es un Upsert, por lo que se creará el registro si no existe y lo actualizará si ya existe en destino.

Muy bien, ahora simplemente validamos y publicamos, para guardar nuestros cambios.

Ejecutando nuestro pipeline

Listo, al estar creado el pipeline toca probarlo, pero antes fíjate que he borrado los contactos que tenía cargados en mi trial de Dynamics para ver los cambios una vez ejecutado pipeline.

Ahora le damos al play en el botón de Debug.

 

Se nos mostrará ahora la ejecución de nuestro pipeline y si nada falla nos aparecerá la ejecución como exitosa.

Ahora en nuestro Dynamics vemos que según la query que indicamos deberíamos tener cargados 10 registros.

Perfecto, parece que todo ha salido bien.

Nada más lejos de la realidad

¿Vamos, cuando ha salido bien a la primera? ¿Ha sido bonito no? Un ejemplo de ETL de la entidad contacto donde solo llevamos 10 registros. Pero Javi, tardabas menos con una importación de Excel. Sí, es cierto, no todo es color de rosa.

Es cierto que siguiendo los pasos conseguirás un pequeño logro, pero en la práctica y en el día a día utilizando la herramienta es posible que el DF nos deje alguna que otra piedra por el camino, piedras que no hacen más nada que dejarnos experiencia. Por ejemplo, pudiese pasar que:

  • No te reconozca la metadata de los campos de tu base de datos.
  • No se entere de que el campo contactid es el campo clave de los registros, o que el campo lastname es de tipo nvarchar.
  • Puede que dé un fallo la conexión del Azure Sql, puesto que el número de conexiones las hayas dejado vacía.

Como esto y otras cosas pueden pasar, te invito a leer la segunda parte de este artículo donde programaremos la ejecución de nuestro pipeline de copia, complicando un poco más la ETL, resolveremos algunos errores comunes, veremos algunas particularidades con otras entidades de CRM y por supuesto usaremos la calculadora de Azure para realizar un estimado de gastos en nuestra actividad de copia.