Encapsulación de DAGs y Servicios en Apache Airflow.

Modularidad, Escalabilidad y Clean Installations con Docker

Apache Airflow

Introducción

Apache Airflow se ha consolidado como una herramienta esencial para la orquestación de flujos de trabajo (workflows) en proyectos de datos. Sin embargo, en entornos productivos y de gran escala, la centralización de DAGs y servicios en un único servidor puede generar problemas de flexibilidad, escalabilidad y mantenimiento.

Este artículo propone una solución que se basa en la separación de DAGs del motor de Airflow, la encapsulación de servicios en contenedores Docker y la adopción del paradigma de «clean installations». A lo largo de esta explicación, veremos cómo la arquitectura modular y basada en Docker mejora la gestión de flujos de trabajo, simplificando tanto el despliegue como el mantenimiento del sistema.

Descripción de la Solución

1. Separación de DAGs y Uso de Volúmenes Compartidos.

En entornos tradicionales, los DAGs y scripts de Airflow se almacenan directamente en el servidor que ejecuta Airflow. Sin embargo, al utilizar Docker, podemos desacoplar los DAGs del servidor mediante volúmenes compartidos. Los DAGs y nuevas funcionalidades se despliegan en un volumen físico del sistema host y luego se replican automáticamente a todos los contenedores que ejecutan Airflow.
Esto permite un despliegue sencillo de nuevas funcionalidades sin tener que reiniciar ni reconfigurar los contenedores. Todos los contenedores de ejecución (scheduler, webserver, workers) acceden a las mismas funcionalidades a través de los volúmenes compartidos.

2. Encapsulación de Servicios en Docker

Otro aspecto clave de nuestra solución es la encapsulación de servicios dentro de contenedores Docker. Esto permite gestionar diferentes tipos de servicios de manera independiente, asegurando que cada servicio tenga sus propias dependencias y ciclo de vida sin afectar el servidor o el resto del sistema.
Definimos dos tipos principales de servicios encapsulados:

Run Execute Dead: Son servicios que ejecutan una tarea y finalizan. Perfecto para trabajos puntuales, como scripts o procesos batch.

Ejemplo de comando Docker:

Apache Airflow.  Ejemplo de comando Docker:

Run Listening: Son servicios que permanecen activos, escuchando eventos o ejecutando procesos continuos. Un ejemplo común sería un servidor que espera conexiones o un servicio de cola de mensajes.

Ejemplo de comando Docker:

Apache Airflow. Ejemplo de comando Docker:

3. Paradigma de Clean Installations.

Una de las principales ventajas de encapsular servicios en Docker es la implementación del paradigma de «clean installations». Al ejecutar todas las dependencias y servicios dentro de contenedores, el entorno físico del servidor permanece limpio y sin la necesidad de instalaciones directas de software como Python, R o cualquier otra dependencia.

Esto reduce los conflictos de versiones, facilita la portabilidad del sistema y asegura que cada contenedor tenga exactamente las versiones y configuraciones que necesita para funcionar correctamente, sin alterar el entorno base.

Evaluación de Soluciones

Centralización Tradicional de DAGs y Servicios:

    • Pros: Simplicidad de configuración inicial, ya que todo está centralizado.
    • Contras: Dificultad para escalar y problemas de mantenimiento al instalar dependencias directamente en el servidor.

Separación de DAGs y Uso de Volúmenes Comunes con Docker:

    • Pros: Flexibilidad y facilidad de despliegue de nuevas funcionalidades. Los volúmenes compartidos permiten que los DAGs se distribuyan automáticamente a los contenedores.
    • Contras: Aunque puede parecer complejo al principio, el despliegue se simplifica notablemente al centralizar la configuración en un único archivo, docker-compose.yaml.

Encapsulación de Servicios y Clean Installations

    • Pros: Aislamiento total de dependencias, facilidad para portar servicios a otros entornos sin ensuciar el servidor físico.
    • Contras: Requiere un esfuerzo inicial para preparar las imágenes Docker, pero una vez hecho, el sistema es mucho más fácil de gestionar.

Apache Airflow - Representación del esquema a montar.

Parte Técnica

Configuración Completa de un Servidor Airflow con Docker Compose

A continuación, se muestra una configuración completa de docker-compose.yaml que incluye todos los servicios principales necesarios para un entorno de Apache Airflow montado en microservicios. Esta configuración aprovecha los volúmenes compartidos para sincronizar los DAGs, logs y plugins entre los contenedores de ejecución de Airflow.

1. Docker Compose YAML:

Docker Compose YAML:Docker Compose YAML:Docker Compose YAML:Docker Compose YAML:

2. Explicación de los Servicios:

    1. PostgreSQL (Base de datos): Almacena toda la información relacionada con la ejecución de DAGs, historiales de tareas y resultados.
    2. Redis (Broker de Celery): Se utiliza como sistema de mensajería para Celery, que gestiona la cola de tareas distribuidas entre los diferentes trabajadores.
    3. Airflow Webserver: Proporciona la interfaz gráfica (UI) donde puedes visualizar, gestionar y ejecutar DAGs. Corre en el puerto 8080.
    4. Airflow Scheduler: Programa las tareas de los DAGs y las distribuye entre los diferentes trabajadores.
    5. Airflow Workers: Son los trabajadores de Celery que ejecutan las tareas distribuidas por el scheduler. En este ejemplo, se configuran dos workers para ilustrar la escalabilidad horizontal.
    6. Airflow Init: Inicializa la base de datos de Airflow y crea un usuario administrador. Este servicio se ejecuta una sola vez

3. Ventajas de esta Configuración:

1. Escalabilidad: Añadir más workers es tan sencillo como duplicar la sección correspondiente en el docker-compose.yaml.

2. Mantenimiento de Logs: Cada servicio genera sus propios logs, facilitando la monitorización y depuración.
Ejemplo de acceso a logs de un worker:

Ejemplo de acceso a logs de un worker:

3. Despliegue Simplificado: Al centralizar la configuración en un único archivo, se reduce la complejidad y se facilita el mantenimiento.

4. Ejemplos de Servicios Encapsulados

Run Execute Dead:

Run Execute Dead:

Run Listening:

Run Listening:

Conclusión

En este artículo hemos explorado cómo la separación de DAGs, la encapsulación de servicios en Docker y el uso de volúmenes compartidos proporcionan una arquitectura escalable y flexible para gestionar flujos de trabajo en Apache Airflow. La configuración completa con Docker Compose permite aprovechar al máximo las ventajas de los microservicios, facilitando el despliegue, la escalabilidad y el mantenimiento del sistema.

Aunque la configuración inicial puede parecer compleja, el uso de Docker Compose centraliza la gestión en un único archivo de configuración. Además, el paradigma de «clean installations» asegura que el entorno del servidor permanezca limpio y libre de conflictos, mejorando la portabilidad y el mantenimiento a largo plazo.

<span style="font-size:80%">Autor </span><a href="https://blog.kairosds.com/author/saulacuna/" target="_self">Saul Acuña</a>

Autor Saul Acuña

Nov 11, 2024

Otros artículos

Anotación @Lazy

Anotación @Lazy

¿Qué es? Es una anotación de Spring que nos permite posponer la creación de beans, de tal forma que éstos sólo se crearán cuando se vayan a utilizar, en lugar de crearlos al iniciar la aplicación. Ésto nos puede servir en aplicaciones que tienen funcionalidades muy...

Deceye – Turning transparency into depth

Deceye – Turning transparency into depth

¿DeFi? ¿DAOs? ¿En qué consiste eso? ¿Qué papel juegan? El ecosistema DeFi, Decentralized Finances, en castellano Finanzas Descentralizadas, engloba a todos aquellos servicios financieros que gracias a la tecnología blockchain pueden evitar la intermediación que ofrece...

Colecciones Kotlin

Colecciones Kotlin

¿Qué son las colecciones Kotlin? Una colección suele contener varios objetos del mismo tipo (este número también puede ser cero). Así mismo, los objetos de una colección se denominan “elements” o “ítems”. Las listas son colecciones ordenadas con acceso a elementos...