El uso de Databricks se ha extendido durante los últimos años en procesos analíticos y de integración de datos, del tal manera que hoy día ya se encuentran disponibles en las 3 cloud que dominan el mercado: Microsoft Azure, Amazon Web Services (AWS) y Google Cloud Platform (GCP). En paralelo, hablando puntualmente sobre soluciones en Azure cloud, el uso de Azure Data Factory como orquestador e integrador de datos desde el on premise y multi-cloud toma mucha relevancia, también porque a partir de una interfaz gráfica permite la generación de pipelines de datos potentes con una curva de aprendizaje relativamente corta.
Estos dos componentes regularmente se encuentran en lo que se denominan como las arquitecturas de datos moderna, tal como se observa en el siguiente diagrama de arquitectura.
Databricks es un componente versátil, que puede ser utilizado en arquitecturas lambda y kappa sin problema alguno.
Si ya utilizas esta solución y deseas integrarla con Azure Data Factory, este artículo es para ti, pues a partir de este momento te explicaré como hacer llamados de los Databricks notebooks desde ADF con un esfuerzo mínimo.
En este artículo:
Uso de dbutils
En muchas oportunidades requerimos enviarle la ruta de un archivo, el nombre de una tabla, una fecha o cualquier otro dato a nuestro proceso como input. En estos casos es ideal la configuración y parametrización del notebook, y para lograrlo podremos hacer uso de las utilidades de databricks o dbutils (disponible en todos los notebooks de Python, R y Scala). La definición del dbutils se la dejaré a databricks, por lo que citaré lo que la documentación de databricks dice:
Databricks Utilities (
https://docs.databricks.com/dev-tools/databricks-utils.htmldbutils
) facilitan la realización de potentes combinaciones de tareas. Podrás utilizar las utilidades para trabajar con el almacenamiento de forma eficiente, para encadenar y parametrizar notebooks, y trabajar con secretos.
Para parametrizar nuestro notebook utilizaremos los widgets de las utilidades de databricks (dbutils.widgets), el cual nos permitirá leer un valor entrante a nuestra ejecución. Esto lo logramos con una corta línea:
Podremos requerir de un único parámetro, o de varios de estos, y para ello lo único que debemos hacer es diferencial a través del nombre del mismo entre las comillas.
Parametrización de notebook en Azure Databricks
Ubicados en el notebook que vamos a parametrizar, en mi caso y para este ejemplo he creado un proceso muy sencillo que solo arroja la diferencia entre dos fechas, identificaremos las variables que queremos recibir como parámetro, y a estas asignaremos el valor que se obtenga del uso de dbutils.widget.get(‘nombre_del_parámetro’), tal como se observa en las líneas 9-11 del siguiente código. Es importante mencionar que no es necesario que el nombre de la variable que recibe el valor del parámetro no necesariamente debe ser igual al nombre del parámetro que le estamos enviando.
Una vez asignado el valor del parámetro a la variable, lo que queda es la realización de nuestro proceso utilizando estos valores como deba.
Generar access token en Azure Databricks
Antes de salir de nuestro workspace de databricks y pasar a configurar nuestro notebook en Azure Data Factory, debemos generar un access token para que estos dos servicios se puedan hablar. Para ellos vamos a las configuraciones de usuario (User Settings) que se encuentran en la parte superior derecha del UI del workspace. Allí, en la opción de Access Token daremos clic sobre el botón “Generate New Token“
En el formulario que se nos abrirá, darmos un nombre a nuestro token, y estableceremos la vigencia de esté. Si no deseas que este token caduque, solo debes dejar vacío el lifetime.
Una vez generado el token, copialo y guardalo en un ligar seguro.
Crear linked service de Azure Databricks en Azure Data Factory
Ahora, en Azure Data Factory crearemos el linked service para comunicarlos con el workspace de Azure Databricks. Para ello nos dirigimos a “Manage > Linked services > New“, allí, en la opción de “Compute” seleccionaremos Azure Databricks.
Agregamos la información del workspace, incluyendo el access token que generamos en el paso anterior.
En un ambiente corporativo sugeriría el uso de Azure Key Vault para almacenar el access token, y así mantener este secreto seguro, pero en esta oportunidad he decidido almacenarlo directamente en ADF y así no hacer este artículo más extenso.
Ya tenemos todo listo para ejecutar nuestro notebook desde Azure Data Factory.
Configurar actividad de Azure Data Factory para ejecutar notebook
Ubicados en el pipeline que hará el llamado al notebook, selecciona y arrastra hacia el canva la actividad “Databricks > Notebook”, dale el nombre que corresponda, en “Azure Databricks” selecciona el linked service que acabas de crear, y utilizando el botón “Browse” en “Settings” navega hasta encontrar el notebook que ejecutarás.
En “Base parameters”, agrega los parámetros que enviarás, los nombres de estos deben coincidir con los nombres que les diste en la obtención con dbutils.widget.get(‘nombre_del_parámetro’).
Pruebas
No queda más que ejecutar nuestro pipeline en modo debug, antes de asignarle un trigger. En el output de nuestro proceso podremos ver el avance del mismo, y aunque ADF per se no nos brinda mucho detalle de la ejecución del notebook, al dar clic sobre los lentes, podremos ver la URL del job en databricks.
Se mostrará tal como lo observamos en la siguiente captura:
Al acceder a la URL, podremos ver el detalle de cada comando del notebook, también su estado y parámetros recibidos, así:
Conclusiones
Azure Data Factory puede orquestar y programar la ejecución de procesos desarrollados sobre notebooks de Azure Databricks sin complejidad alguna. Aunque durante la ejecución de estos procesos, ADF no reporta el detalle del proceso, sí nos muestra los estados de en cola, en ejecución, exitoso y fallido. Así mismo, generar una parametrización para el envío de datos hacia en notebook es algo que no requiere grandes cambios en los desarrollos actuales y/o futuros.