En este post hablaremos sobre los diferentes tipos de cómputos disponibles en Databricks, sus características, ventajas e inconvenientes, además de comentar consideraciones importantes que tener en cuenta a la hora de elegir el tipo de cómputo para tu proceso.
¡Comenzamos!
Los procesos de extracción, transformación y carga (ETL) son un paso fundamental en el mundo de la analítica de datos, y en esa línea Databricks nos facilita una plataforma unificada en la cual podemos implementar procesos completos de ETL, pero también nos permite ejecutar cuadernos para realizar partes específicas del proceso. Esa característica nos permite, por ejemplo, tener un proceso orquestado por una herramienta como Azure Data Factory que tiene más de 140 conectores de datos diferentes, lo que es una ventaja a la hora de realizar la E de la ETL, y usar Azure Databricks para la T y la L.
Al configurar un flujo de trabajo en Databricks, o la ejecución de un cuaderno desde Data Factory, una de las primeras configuraciones que tenemos que definir es qué clúster vamos a usar para ejecutar el proceso. Antes mismo de configurar el tamaño (capacidad y memoria) del clúster, debemos elegir entre los diferentes tipos de cómputo disponibles, donde cada uno está pensado para un tipo de uso y tiene un costo por DBU asociado. Esa definición puede marcar la diferencia a la hora de pagar la factura.
A continuación, describimos los diferentes tipos de cómputos, para qué está pensado cada uno y comentaremos una serie de pruebas que hemos realizado de cara a ayudar en la selección del tipo de cómputo.
tipo de cómputo
Cómputo Interactivo:
Los clústeres interactivos son cómputos que se pueden encender y apagar bajo demanda, y podemos pensar en él como un recurso computacional genérico. Es el tipo de cómputo con mayor versatilidad, pero también el más costoso. Se recomiendan para uso interactivo y colaborativo mediante cuadernos (notebooks). Se pueden crear, reiniciar y finalizar, siempre y cuando tengas los permisos adecuados. Además, se pueden ejecutar códigos en Python, R, Scala y SQL.
Cómputo de trabajos:
Este tipo de cómputo está bastante centrado en uso en entornos productivos, donde su uso es recomendado para ejecutar de manera rápida y robusta tareas automatizadas. Este cómputo se crea exclusivamente para ejecutar la tarea, y se elimina al terminarla. Es el tipo de cómputo más barato, pero no se puede usar durante análisis exploratorias, ni tampoco compartirlo entre diferentes flujos de trabajo, pero es posible compartir el recurso entre diferentes tareas dentro del mismo flujo.
Pools:
Son grupos de instancias inactivas listas para usar. Se puede configurar la cantidad mínima de instancias inactivas y la idea principal es reducir el tiempo de inicio de procesos. Al configurar un pool, podemos aprovisionar de manera rápida recursos para que cuando llegue una nueva carga de trabajo no se tenga que esperar hasta que se encienda un nuevo clúster. Es un recurso más barato que el interactivo y más caro que el cómputo de trabajo, pero debemos tener en mente que estamos manteniendo un recurso ocioso.
Almacenes de SQL:
Existen dos formas de Almacenes de SQL, el clásico y el serverless. Ambos están pensados para ejecutar comandos SQL, y solo SQL. Tienen como característica un tiempo de encendido reducido, en el caso del serverless es casi instantáneo. El serverless es un recurso que está alojado dentro de la cuenta de Databricks, y no en la cuenta de Azure como los demás cómputos. Eso tiene implicaciones a nivel de seguridad y conectividad, que se deben gestionar.
Ilustración 1 – Arquitectura de Azure Databricks. Fuente : https://learn.microsoft.com/en-us/azure/databricks/getting-started/overview
Experimento
La ejecución de dicha carga se configuró tanto desde Data Factory, con un pipeline compuesto por un bucle que ejecuta la carga de las cuatro tablas de forma paralela, como desde Databricks con flujos de trabajo, con una tarea por tabla, con las cuatro tareas ejecutándose en paralelo.
Para todas las ejecuciones hemos utilizamos clústeres con las configuraciones que se ven abajo. En todos los casos la cantidad de DBUs es la misma, 1,5DBU/h. En el caso del clúster interactivo, está configurado para apagarse automáticamente tras 10 minutos de inactividad (valor mínimo). Con el objetivo de acotar el análisis, no se llevaron a cabo experimentos con Almacenes de SQL ni pools. En el momento que los experimentos fueron ejecutados, el coste informado era de €0,508 / DBU/h para el cómputo interactivo y €0,278 / DBU/h para el cómputo de trabajo, ya que todos los experimentos se ejecutaron en un área de trabajo Premium.
Ilustración 2 – Configuración de clúster utilizada durante los experimentos.
Resultados
Para el cómputo interactivo ejecutado desde ADF, hemos obtenido un tiempo medio de ejecución de 1:55, en los casos que el clúster ya estaba encendido y 7:16 en los casos en los que hubo que encender el clúster antes de ejecutar el proceso. En un caso coincidió que el clúster estaba en proceso de apagarse cuando se lanzó la carga. En esa ocasión el proceso tardó un total de 11:27. Las ejecuciones conllevaron un coste de 1,38€.
Por otro lado, las ejecuciones desde ADF usando cómputos de trabajo estuvieron bastante constantes, con un tiempo promedio de ejecución de 6:53, pero para cada entidad se levantaba un clúster (cuatro clústeres por carga), implicando un coste de 0,76€, aun así, bastante inferior al interactivo.
En el caso del uso de un clúster interactivo en un flujo de trabajo de databricks ocurre algo parecido que en el uso de este mismo tipo de clúster en ADF en cuanto a tiempos. En esta opción, el tiempo medio con el clúster apagado fue de 6:58 y con el clúster ya encendido fue de 1:38. El coste total de las ejecuciones fue de 1,30€.
Usando cómputos de trabajo en los flujos de trabajo de Databricks se ve una gran diferencia con respecto a la utilización de éste en ADF, por lo comentado anteriormente del número de clústeres levantados. Para este caso, se emplea un tiempo medio de 7:08, y sólo se enciende un clúster que ejecuta todo el proceso paralelizando las tareas internamente. En este caso el coste que conlleva es de 0,12€.
Ilustración 3 – Tiempos y costes totales de las ejecuciones.
Consideraciones
Buscar utilizar toda la capacidad disponible de cada clúster, por ejemplo, paralelizando tareas en un mismo clúster, también es algo que tener en cuenta. Sin embargo, eso no es tan sencillo de implementar a partir de herramientas externas como Azure Data Factory o Synapse Analytics, pero sí se puede hacer desde los flujos de trabajo de Databricks.
Por otra parte, es importante destacar que los cómputos interactivos nos permiten someter varios flujos de trabajo al mismo clúster, y éste se encarga de la paralelización (y escalado, si así estuviera configurado). Así logramos una mejor utilización de los recursos. Además, si el clúster ya está activo, no necesitamos esperar a que se encienda para ejecutar la tarea y así reducimos el tiempo de ejecución de los procesos.
Finalmente, queda evidente que un buen análisis de los procesos y un dimensionamiento adecuado de los clústeres pueden generar un ahorro significativo, sobre todo si no existe la presión por la velocidad en el proceso.
Referencias
https://www.databricks.com/product/pricing
https://learn.microsoft.com/en-us/azure/databricks/getting-started/overview
https://learn.microsoft.com/es-es/fabric/data-factory/connector-overview
https://learn.microsoft.com/es-es/azure/databricks/workflows/jobs/use-compute