Empezando con Apache Airflow: Orquestando flujos de trabajo
Airflow es una plataforma para programáticamente crear, programar y monitorizar flujos de trabajo, es de código abierto y fue escrita en Python. Un flujo de trabajo es una secuencia de pasos que conforman un proceso, dentro de la herramienta se define como un grafo acíclico dirigido DAG (Directed Acyclic Graphs) de tareas atómicas. Para ejecutar estas tareas existen operadores predefinidos y también contamos con la posibilidad de desarrollarlos de forma sencilla. Mas información en https://airflow.apache.org/
🤓 Conceptos básicos
Componentes
- Webserver: Un server Flask con Gunicorn para acceder a la intefaz gráfica
- Scheduler: Responsable de programar las tareas
- Metadata database: Base de datos donde se guardan los metadatos de Airflow: información sobre DAGs, conexiones, variables, usuarios
- Executor: Define como son ejecutadas las tareas
Conceptos clave
- DAG: Una representación gráfica de varias tareas
- Operator: Representa una tarea en Airflow
- Task: Una instancia de un Operator
- Task Instances: Una ejecución especifica de una tarea (tiene timestamp)
- Workflow: Combinación de todos los anteriores
¿Qué es un DAG?
Es un grupo de tareas que quieres ejecutar, organizadas de forma que se reflejen sus relaciones y dependencias. Define cómo se va ejecutar un flujo de trabajo.
¿Qué es un Operator?
Es una tarea en un flujo de trabajo.
- Representan una única tarea
- Al instanciarlos se crea una tarea
Tipos de Operator
- Acciones: PostgreSQL, MySQL
- Transferencia: S3ToRedshift, BigQueryToGCS, MySqlToS3
- Sensores: S3Sensor, SQL Sensor
¿Qué son los Hooks?
Los Hooks son interfaces para conectarse con servicios externos. Sirven para conectarse a servicios externos desde PythonOperator. Tambén sirven para utilizarlos para hacer Operators.
¿Qué es XCom?
La forma que tiene Airflow de que las tareas compartan información entre ellas.
⛴️ Desplegando Apache Airflow con Docker Compose
A continuación les comparto un proyecto para levantar los servicios de Apache Airflow con Docker Compose. El ambiente tiene las siguientes características:
- Base de datos: Postgres 12.3
- Airflow 2.0.1 (init, webserver, scheduler)
- Gestor de bases de datos: Pgadmin 4
Además cuenta con un ejemplo de un DAG sencillo llamado hello_world, lo podrás encontrar en la carpeta DAG
⌨️ Creando nuestro primer DAG (Hello World DAG)
Un DAG es un script de Python en el que se configuran y se definen las tareas que hacen parte del flujo de trabajo. A continuación vamos a crear archivo en la carpeta de dags, este ejemplo lo titulé: hello_world.py, este archivo tendrá tres tareas sencillas que se ejecutarán de forma secuencial, cada una con un operador diferente.
from datetime import datetimefrom airflow.models import DAG
from airflow.operators.dummy_operator import DummyOperator
from airflow.operators.bash_operator import BashOperator
from airflow.operators.python_operator import PythonOperatordefault_args = {
'owner': 'davidcasr',
'start_date': datetime(2021, 3, 1, 12, 0, 0)
}def hello_world_loop():
for palabra in ['hello', 'world']:
print(palabra)with DAG(
dag_id='hello_world',
default_args = default_args,
schedule_interval='@once'
) as dag: test_start = DummyOperator(task_id='test_start') test_python = PythonOperator(task_id='test_python', python_callable=hello_world_loop) test_bash = BashOperator(task_id='test_bash', bash_command='echo Hello World!')test_start >> test_python >> test_bash
Los operadores usados fueron:
- DummyOperator: Es un operador que literalmente no hace nada. Puede usarse para agrupar tareas en un DAG
- BashOperator: Es un operador para ejecutar comandos en un shell Bash
- PythonOperator: Es un operador para ejecutar llamadas a funciones Python
⚡ Ejecutar el DAG
Con el DAG definido y ubicado en la carpeta de DAG, podemos abrir nuestro navegador e ir a localhost:8080. Después buscamos el DAG creado y lo habilitamos en el switch button ubicado en la parte izquierda del DAG hello_world.
Referencias
- Documentación Oficial: https://airflow.apache.org/docs/apache-airflow/stable/index.html