Skip to main content

· 12 min read

Cuando envías tu código al equipo de ingeniería, puede ser frustrante encontrarse con problemas de compatibilidad con diferentes sistemas operativos y versiones de bibliotecas.

Docker puede resolver problemas de compatibilidad entre sistemas operativos y versiones de bibliotecas al enviar código a los equipos de ingeniería, haciendo que la ejecución del código sea fluida sin importar su configuración subyacente.

En este doc presentaremos los conceptos esenciales de Docker, te guiaremos a través de la instalación, demostraremos su uso práctico con ejemplos, revelaremos las mejores prácticas de la industria y responderemos cualquier pregunta relacionada en el camino. ¡Así que despídete de los problemas de compatibilidad y optimiza tu flujo de trabajo de aprendizaje automático o ingenería de datos con Docker!

Introducción a Docker

Docker vs Contenedores vs Imágenes Docker

Docker es una plataforma comercial de contenedorización y tiempo de ejecución que ayuda a los desarrolladores a crear, desplegar y ejecutar contenedores. Utiliza una arquitectura cliente-servidor con comandos simples y automatización a través de una única API.

Con Docker, los desarrolladores pueden crear aplicaciones contenedorizadas escribiendo un Dockerfile, que es esencialmente una receta para construir una imagen de contenedor. Docker luego proporciona un conjunto de herramientas para construir y gestionar estas imágenes de contenedor, facilitando a los desarrolladores el empaquetado y despliegue de sus aplicaciones de manera consistente y reproducible.

Un contenedor es un paquete de software ejecutable, liviano y portátil que incluye todo lo que una aplicación necesita para ejecutarse, incluyendo código, bibliotecas, herramientas del sistema y configuraciones.

Los contenedores se crean a partir de imágenes que definen el contenido y la configuración del contenedor, y están aislados del sistema operativo host y otros contenedores en el mismo sistema.

Este aislamiento es posible gracias al uso de tecnologías de virtualización y aislamiento de procesos, que permiten a los contenedores compartir los recursos de una sola instancia del sistema operativo host mientras proporcionan un entorno seguro y predecible para la ejecución de aplicaciones.

Una Imagen Docker es un archivo de solo lectura que contiene todas las instrucciones necesarias para crear un contenedor. Se utilizan para crear y empezar nuevos contenedores en tiempo de ejecución.

Importancia de Docker para los Científicos e ingenieros de Datos

Docker permite a los desarrolladores acceder a estas capacidades de contenedorización nativas utilizando comandos simples y automatizarlas a través de una interfaz de programación de aplicaciones (API) que ahorra trabajo. Docker ofrece:

  • Portabilidad mejorada y sin problemas de los contenedores: Los contenedores de Docker se ejecutan sin modificaciones en cualquier entorno de escritorio, centro de datos o nube.
  • Actualizaciones aún más ligeras y granulares: Se pueden combinar múltiples procesos dentro de un solo contenedor. Esto permite construir una aplicación que puede seguir funcionando mientras una de sus partes se detiene para una actualización o reparación.
  • Creación automatizada de contenedores: Docker puede construir automáticamente un contenedor basado en el código fuente de la aplicación.
  • Versionado de contenedores: Docker puede rastrear versiones de una imagen de contenedor, revertir a versiones anteriores y rastrear quién construyó una versión y cómo. Incluso puede cargar solo las diferencias entre una versión existente y una nueva.
  • Reutilización de contenedores: Se pueden usar contenedores existentes como imágenes base, esencialmente como plantillas para construir nuevos contenedores.
  • Bibliotecas de contenedores compartidas: Los desarrolladores pueden acceder a un registro de código abierto que contiene miles de contenedores contribuidos por usuarios.

Comenzando con Docker

Después de presentar Docker, veamos cómo podemos usarlo para nuestros proyectos de ciencia de datos. Primero, comenzaremos con la instalación de Docker en tu máquina local y luego introduciremos los comandos básicos de Docker.

Instalación de Docker en Tu Máquina

Instalar Docker en tu máquina es bastante fácil. Puedes seguir las instrucciones disponibles en la documentación oficial:

  • Instrucciones para instalar Docker en Linux.
  • Instrucciones para instalar Docker en Windows.
  • Instrucciones para instalar Docker en Mac.

Es importante notar que si deseas crear tus propias imágenes y subirlas a Docker Hub, debes crear una cuenta en Docker Hub. Piensa en Docker Hub como un lugar central donde los desarrolladores pueden almacenar y compartir sus imágenes de Docker.

Comandos Básicos de Docker

Una vez que hayas instalado Docker en tu máquina, exploremos algunos de los comandos básicos de Docker que debes conocer.

  1. docker run: El comando "docker run" se utiliza para crear y arrancar un nuevo contenedor basado en una imagen Docker. Esta es la sintaxis básica para ejecutar un contenedor:

    docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
    • OPTIONS: Opciones adicionales que se pueden usar para personalizar el comportamiento del contenedor, como especificar puertos, volúmenes, variables de entorno, etc.
    • IMAGE: El nombre de la imagen Docker para usar al crear el contenedor.
    • COMMAND: (Opcional) El comando que se ejecutará dentro del contenedor.
    • ARG: (Opcional) Argumentos pasados al comando dentro del contenedor.

    Por ejemplo, para ejecutar un contenedor basado en la imagen "ubuntu" y ejecutar el comando "ls" dentro del contenedor, usarías el siguiente comando:

    docker run ubuntu ls

    Esto creará un nuevo contenedor utilizando la imagen "ubuntu" y ejecutará el comando "ls", que lista los archivos y directorios dentro del sistema de archivos del contenedor. Ten en cuenta que si la imagen especificada no está disponible localmente, Docker la descargará automáticamente de un registro Docker antes de crear el contenedor.

  2. docker ps: El comando "docker ps" se usa para listar los contenedores en ejecución en tu host Docker. Proporciona información como el ID del contenedor, la imagen utilizada, el comando que se está ejecutando, el estado y las asignaciones de puertos. Esta es la sintaxis básica:

    docker ps [OPTIONS]

    Por defecto, "docker ps" solo muestra los contenedores en ejecución. Si deseas ver todos los contenedores, incluidos los que están detenidos o salieron, puedes usar la opción "-a":

    docker ps -a
  3. docker stop: El comando "docker stop" se usa para detener uno o más contenedores en ejecución. Envía una señal al proceso principal del contenedor, solicitándole que se detenga de manera ordenada. Esta es la sintaxis básica:

    docker stop [OPTIONS] CONTAINER [CONTAINER...]
    • OPTIONS: Opciones adicionales que se pueden usar para personalizar el comportamiento de detención. Por ejemplo, puedes especificar un período de tiempo de espera con la opción "--time" o "-t" para permitir que el contenedor tenga más tiempo para detenerse de manera ordenada antes de terminarlo a la fuerza.
    • CONTAINER: El nombre o ID del contenedor(es) a detener. Puedes especificar varios contenedores separados por espacios.

    Por ejemplo, para detener un contenedor con el nombre "mi-contenedor", usarías el siguiente comando:

    docker stop mi-contenedor
  4. docker rm: El comando "docker rm" se usa para eliminar uno o más contenedores detenidos de tu host Docker. Elimina permanentemente el contenedor(es)

especificado(s) y libera cualquier recurso asociado. Esta es la sintaxis básica:

docker rm [OPTIONS] CONTAINER [CONTAINER...]
  • OPTIONS: Opciones adicionales que se pueden usar para personalizar el comportamiento de eliminación. Por ejemplo, puedes usar la opción "-f" o "--force" para forzar la eliminación de un contenedor en ejecución.
  • CONTAINER: El nombre o ID del contenedor(es) a eliminar. Puedes especificar varios contenedores separados por espacios.

Por ejemplo, para eliminar un contenedor con el nombre "mi-contenedor", usarías el siguiente comando:

docker rm mi-contenedor
  1. docker images: El comando "docker images" se usa para listar todas las imágenes disponibles en tu host Docker. Proporciona información sobre cada imagen, como el nombre del repositorio, la etiqueta, el ID de la imagen, la fecha de creación y el tamaño. Esta es la sintaxis básica:

    docker images [OPTIONS] [REPOSITORY[:TAG]]
    • OPTIONS: Opciones adicionales que se pueden usar para personalizar el comportamiento del comando. Por ejemplo, puedes usar la opción "-a" o "--all" para mostrar todas las imágenes (incluidas las intermedias).
    • REPOSITORY[:TAG]: (Opcional) Especifica un repositorio y una etiqueta para filtrar los resultados. Si solo se proporciona el repositorio, se mostrarán todas las etiquetas asociadas.

    Por ejemplo, para listar todas las imágenes en tu host Docker, usarías el siguiente comando:

    docker images
  2. docker rmi: El comando "docker rmi" se usa para eliminar una o más imágenes de tu host Docker. Elimina permanentemente las imágenes especificadas y libera cualquier espacio en disco asociado. Esta es la sintaxis básica:

    docker rmi [OPTIONS] IMAGE [IMAGE...]
    • OPTIONS: Opciones adicionales que se pueden usar para personalizar el comportamiento de eliminación. Por ejemplo, puedes usar la opción "-f" o "--force" para forzar la eliminación de una imagen en uso por un contenedor.
    • IMAGE: El nombre o ID de la imagen(es) a eliminar. Puedes especificar varias imágenes separadas por espacios.

    Por ejemplo, para eliminar una imagen con el nombre "mi-imagen", usarías el siguiente comando:

    docker rmi mi-imagen
  3. docker build: El comando "docker build" se usa para construir una imagen Docker a partir de un Dockerfile y un contexto de construcción. Crea una nueva imagen ejecutando las instrucciones especificadas en el Dockerfile. Esta es la sintaxis básica:

    docker build [OPTIONS] PATH | URL | -
    • OPTIONS: Opciones adicionales que se pueden usar para personalizar el comportamiento de construcción. Por ejemplo, puedes usar la opción "-t" o "--tag" para asignar una etiqueta a la imagen construida.
    • PATH | URL | -: Especifica la ubicación del Dockerfile y el contexto de construcción. Puede ser una ruta local, una URL o "-" para leer desde la entrada estándar (stdin).

    Por ejemplo, para construir una imagen desde un Dockerfile en el directorio actual y asignarle una etiqueta "mi-imagen", usarías el siguiente comando:

    docker build -t mi-imagen .
  4. docker pull: El comando "docker pull" se usa para descargar una imagen desde un registro Docker (como Docker Hub) a tu host Docker. Recupera la imagen especificada y cualquier capa dependiente de la imagen desde el registro. Esta es la sintaxis básica:

    docker pull [OPTIONS] NAME[:TAG|@DIGEST]
    • OPTIONS: Opciones adicionales que se pueden usar para personalizar el comportamiento de la descarga.
    • NAME[:TAG|@DIGEST]: Especifica el nombre de la imagen a descargar. Puedes proporcionar una etiqueta (TAG) o un digest (DIGEST) opcional para una versión específica de la imagen.

    Por ejemplo, para descargar la imagen "ubuntu:latest" desde Docker Hub, usarías el siguiente comando:

    docker pull ubuntu:latest
  5. docker push: El comando "docker push" se usa para subir una imagen desde tu host Docker a un registro Docker (como Docker Hub). Transfiere la imagen especificada y cualquier capa dependiente de la imagen al registro. Esta es la sintaxis básica:

    docker push [OPTIONS] NAME[:TAG]
    • OPTIONS: Opciones adicionales que se pueden usar para personalizar el comportamiento de la carga.
    • NAME[:TAG]: Especifica el nombre de la imagen a cargar. Puedes proporcionar una etiqueta (TAG) opcional para una versión específica de la imagen.

    Por ejemplo, para subir la imagen "mi-imagen:latest" a Docker Hub, usarías el siguiente comando:

    docker push mi-imagen:latest
  6. docker exec: El comando "docker exec" se usa para ejecutar un comando en un contenedor en ejecución. Te permite interactuar con el contenedor y ejecutar comandos adicionales dentro de él. Esta es la sintaxis básica:

    docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
    • OPTIONS: Opciones adicionales que se pueden usar para personalizar el comportamiento de la ejecución. Por ejemplo, puedes usar la opción "-it" para ejecutar el comando en modo interactivo y adjuntar una terminal (TTY).
    • CONTAINER: El nombre o ID del contenedor en el que se ejecutará el comando.
    • COMMAND: El comando a ejecutar dentro del contenedor.
    • ARG: (Opcional) Argumentos pasados al comando dentro del contenedor.

    Por ejemplo, para ejecutar el comando "bash" dentro de un contenedor en ejecución llamado "mi-contenedor" en modo interactivo, usarías el siguiente comando:

    docker exec -it mi-contenedor bash

Dockerizando una Aplicación

Ahora que hemos cubierto los conceptos básicos de Docker y los comandos esenciales, pasemos a un ejemplo práctico de cómo puedes Dockerizar una aplicación. En esta sección, te guiaremos a través de los pasos para definir el entorno, escribir un Dockerfile y construir la imagen de Docker.

Definir el entorno

Antes de Dockerizar tu aplicación, es esencial definir el entorno necesario para ejecutarla. Esto incluye las bibliotecas y dependencias que necesitas. Por ejemplo, supongamos que tienes una aplicación de aprendizaje automático o ingeniería de datos en Python que requiere las siguientes bibliotecas:

  • NumPy
  • Pandas
  • Scikit-learn

Puedes definir tus dependencias en un archivo llamado requirements.txt. Aquí tienes un ejemplo de cómo podría verse:

numpy
pandas
scikit-learn

Escribir un Dockerfile

El siguiente paso es escribir un Dockerfile, que es un archivo de texto con instrucciones para construir una imagen de Docker. Aquí tienes un ejemplo de un Dockerfile para nuestra aplicación de aprendizaje automático:

# Utilizar una imagen base oficial de Python
FROM python:3.8-slim

# Establecer el directorio de trabajo en el contenedor
WORKDIR /app

# Copiar el archivo requirements.txt al directorio de trabajo
COPY requirements.txt .

# Instalar las dependencias
RUN pip install --no-cache-dir -r requirements.txt

# Copiar el resto de la aplicación al directorio de trabajo
COPY . .

# Especificar el comando por defecto que se ejecutará al iniciar el contenedor
CMD ["python", "tu_script_de_aprendizaje_automatico.py"]

Construir la Imagen

Con el Dockerfile definido, puedes construir la imagen de Docker utilizando el comando docker build. Asegúrate de estar en el mismo directorio donde se encuentra el Dockerfile. Usa el siguiente comando para construir la imagen:

docker build -t mi-app-ml .

Aquí, -t mi-app-ml asigna una etiqueta a la imagen para identificarla fácilmente más tarde. El . al final del comando especifica que Docker debe usar el Dockerfile en el directorio actual.

Una vez que la imagen se haya construido correctamente, puedes ejecutarla en un contenedor utilizando el comando docker run:

docker run mi-app-ml

¡Y eso es todo! Has Dockerizado con éxito tu aplicación de aprendizaje automático o ingeniería de datos y ahora puedes ejecutarla en cualquier entorno que soporte Docker sin preocuparte por problemas de compatibilidad.

· 6 min read

El orden de ejecución de las consultas SQL determina cómo se procesan y optimizan las consultas, reduciendo la cantidad de datos a procesar y mejorando significativamente el rendimiento del procesamiento de consultas.

Comprender este orden ayuda a depurar el código, escribir consultas eficientes y obtener resultados de SQL de manera precisa.

¿Por qué es importante?

La importancia del orden de ejecución en las consultas SQL tiene varios enfoques clave:

  1. Optimización de Consultas: El orden de ejecución adecuado puede optimizar la consulta, reduciendo la cantidad de datos procesados y mejorando el rendimiento general. Al ejecutar las cláusulas en el orden correcto, la base de datos puede realizar operaciones más eficientes y obtener resultados más rápidamente.

  2. Precisión en los Resultados: Al seguir un orden específico (como el procesamiento de cláusulas FROM antes que WHERE o GROUP BY), se asegura que los resultados obtenidos sean precisos y reflejen correctamente los datos que se desean consultar o manipular.

  3. Rendimiento del Motor SQL: El motor SQL puede realizar optimizaciones internas basadas en el orden de ejecución definido. Esto incluye la capacidad de utilizar índices y otras técnicas de acceso a datos de manera más efectiva, mejorando así el rendimiento general de las consultas.

  4. Depuración y Mantenimiento del Código: Comprender el orden de ejecución ayuda en la depuración de consultas problemáticas y en la escritura de consultas más eficientes y legibles. Esto facilita el mantenimiento del código SQL a lo largo del tiempo, especialmente en proyectos y sistemas complejos.

  5. Eficiencia de Recursos: Un orden incorrecto de ejecución puede llevar a la utilización ineficiente de recursos como la memoria y el procesamiento del servidor de base de datos. Al optimizar el orden, se minimiza el uso innecesario de recursos y se mejora la escalabilidad del sistema.

Orden de Ejecución en SQL

El orden de ejecución de las cláusulas de una consulta SQL es el siguiente:

  1. FROM: Primero, se procesa la tabla sobre la cual se realiza la operación DML. Por lo tanto, la cláusula FROM es evaluada primero en una consulta SQL. Si la consulta contiene cláusulas JOIN, las tablas se combinan fusionando las filas involucradas antes de la cláusula FROM. Así que, JOIN precede a FROM en declaraciones con JOIN. Ahora se adquieren los datos de la tabla antes de que se aplique cualquier filtro o agrupamiento. Por lo tanto, las cláusulas subsecuentes pueden evaluarse basándose en estos datos, que son mucho más pequeños que las tablas originales antes de las operaciones JOIN. Esto también procesa las subconsultas. SQL puede crear una tabla temporal internamente para evaluar esto. Para hacer el código más eficiente en memoria, es bueno tener JOINs de tabla más simples, ya que sería muy intensivo en memoria.

  2. WHERE: Después de que se procesan los datos de la tabla en la cual se realizan otras operaciones por las cláusulas JOIN y FROM, se evalúa la cláusula WHERE. La cláusula WHERE filtra las filas basándose en condiciones de la tabla evaluada por la cláusula FROM. Esta cláusula WHERE descarta las filas que no satisfacen las condiciones, reduciendo así las filas de datos que deben procesarse más en otras cláusulas.

  3. GROUP BY: Si la consulta tiene una cláusula GROUP BY, se ejecuta a continuación. Aquí, los datos se agrupan según el valor común en la columna especificada en la cláusula GROUP BY. Esto reduce aún más el número de filas a igual número de valores distintos en la columna GROUP BY. Esto ayuda a calcular funciones agregadas.

  4. HAVING: Si la consulta tiene una cláusula GROUP BY, la cláusula HAVING se evalúa inmediatamente después de GROUP BY. La cláusula HAVING no es obligatoria para GROUP BY. Similar a las operaciones WHERE, esta cláusula también filtra el grupo de tablas procesadas previamente por la cláusula GROUP BY. La cláusula HAVING también descarta las filas que no satisfacen las condiciones, reduciendo así las filas de datos que deben procesarse más en otras cláusulas.

  5. SELECT: A continuación se ejecuta SELECT después de GROUP BY y HAVING. Calcula expresiones (aritméticas, agregadas, etc.) y alias proporcionados en la cláusula SELECT. La computación ahora se realiza en el conjunto de datos más pequeño después de las operaciones de filtrado y agrupamiento realizadas por las cláusulas anteriores.

  6. DISTINCT: La cláusula DISTINCT se ejecuta después de evaluar las expresiones y referencias a alias en el paso anterior. Filtra cualquier fila duplicada y devuelve solo filas únicas.

  7. ORDER BY: Después de ejecutar todas las cláusulas anteriores, se calculan los datos que se van a mostrar o procesar. Ahora se ejecuta ORDER BY para ordenarlos según columnas específicas ya sea en orden ascendente o descendente. Es asociativo a la izquierda, es decir, se ordena según la primera columna especificada y luego por la segunda, y así sucesivamente.

  8. LIMIT/OFFSET: Finalmente, después de evaluar el orden de los datos que se van a procesar, se evalúan las cláusulas LIMIT y OFFSET para mostrar solo las filas que caen dentro del límite. Por lo tanto, generalmente no se recomienda LIMIT solo ciertas filas de muchas filas evaluadas antes, ya que no es eficiente y es un desperdicio de computación.

Orden de Ejecución de Ejemplo de Consultas SQL

Vamos a entender el orden de ejecución de una consulta SQL con un ejemplo.

Supongamos que hay una tabla con el nombre "orders" que contiene datos sobre pedidos realizados por clientes, como order_ID, customer_ID, customer_city, order_date y total_amount del pedido.

La siguiente consulta recupera el monto total de todos los pedidos llamados "TOTAL" realizados por clientes que viven en Nueva York y realizaron sus pedidos entre las fechas del 1 de enero de 2022 y el 31 de marzo de 2022, ordenados por el monto total en orden descendente.

Consulta:

SELECT customer_ID, SUM(total_amount) AS "Total"
FROM orders
WHERE order_date BETWEEN '2022-01-01' AND '2022-03-31'
AND customer_city = 'New York'
GROUP BY customer_id
ORDER BY Total DESC;

La consulta anterior se ejecuta de la siguiente manera. Primero, se ejecuta la cláusula FROM para identificar la tabla involucrada, que es "orders". Luego, se ejecuta la cláusula WHERE para filtrar las filas basadas en las condiciones, que en este caso son el rango de fechas usando la operación BETWEEN y el valor de customer_city.

A continuación, se ejecuta la cláusula GROUP BY, que agrupa las filas basadas en customer_ID. Esto nos permite utilizar la función de agregación SUM ahora.

Después, se ejecuta la cláusula SELECT, que recupera las columnas customer_ID y SUM de total_amount correspondiente a cada ID con el nombre de alias "TOTAL".

Por último, se ejecuta la cláusula ORDER BY, que ordena los resultados basados en "TOTAL" en orden descendente. El orden de evaluación se describe en la vista parcial a continuación.

Resultado

Si lo anterior se hubiera ejecutado en un orden diferente, se habrían evaluado algunos resultados incorrectos o la evaluación habría sido lenta. Por ejemplo, si la cláusula ORDER BY se evaluara antes que la cláusula WHERE, los datos se ordenarían primero y luego se habrían agrupado y se habrían obtenido resultados incorrectos.

Al comprender el orden de ejecución de SQL y aplicar técnicas de optimización, se pueden desarrollar consultas eficientes que brinden los resultados deseados con mayor rapidez y precisión.

· 3 min read

Generator

La ingeniería de datos con Apache Airflow nos permite organizar una serie de tareas relacionadas con los datos. Con Airflow, puedes planificar y coordinar cada paso necesario para transformar y mover datos de un lugar a otro. Creas "diagramas" que indican qué tareas deben hacerse y en qué orden, como si fueran instrucciones de una receta. Cada tarea puede ser algo como recopilar datos de una fuente, transformarlos de cierta manera o almacenarlos en una base de datos.

Airflow se asegura de que las tareas se ejecuten en el orden correcto, se programen a la hora adecuada, y se puedan reintentar si algo sale mal. Airflow te ayuda a automatizar y supervisar todo el proceso de manejo de datos, haciéndolo más eficiente y confiable.

Tubería de datos ETL usando Apache Airflow

Estos son unos simples pasos para crear una tubería con Airflow:

  1. Identifica las fuentes y destinos de los datos. ¿De qué fuentes de datos necesita extraer datos? ¿En qué destinos de datos necesita cargar los datos?
  2. Diseña un pipeline ETL. Debes determinar los pasos involucrados en la extracción, transformación y carga de los datos.
  3. Elije los operadores adecuados. Airflow proporciona una variedad de operadores para tareas ETL comunes, como extraer datos de bases de datos, cargar datos en almacenes de datos y transformar datos.
  4. Crea un DAG de flujo de aire. Los DAG (gráficos acíclicos dirigidos) de flujo de aire definen el flujo de trabajo de su canalización ETL.
  5. Configura el DAG. Establece la programación para el DAG y configure las dependencias entre tareas.
  6. Inicia el DAG. Una vez configurado el DAG, puede iniciarlo mediante la interfaz de usuario web o CLI de Airflow.

A continuación veamos un ejemplo simple de un DAG de Airflow para una canalización ETL que extrae datos de una base de datos PostgreSQL y los carga en una base de datos MySQL:

from airflow import DAG  
from airflow.operators.postgres_operator import PostgresOperator
from airflow.operators.mysql_operator import MySqlOperator

dag = DAG('etl_pipeline', start_date='2023-11-03')

extract_task = PostgresOperator(
task_id='extract_data',
sql='SELECT * FROM customers',
postgres_conn_id='postgres_default',
dag=dag
)

load_task = MySqlOperator(
task_id='load_data',
sql='INSERT INTO customers (id, name, email) VALUES (%(id)s, %(name)s, %(email)s)',
mysql_conn_id='mysql_default',
params={'extract_task.output': extract_task.output},
dag=dag
)

extract_task >> load_task

Este DAG extraerá datos de la customerstabla en la base de datos PostgreSQL y los cargará en la customerstabla en la base de datos MySQL.

También puede utilizar Airflow para automatizar canalizaciones ETL más complejas. Por ejemplo, puede utilizar Airflow para transformar datos antes de cargarlos en un almacén de datos o para cargar datos en múltiples destinos de datos.

Consejos adicionales para crear canalizaciones ETL con Airflow:

  • Utilice variables y macros para hacer que sus DAG sean más dinámicos y reutilizables.
  • Utilice las funciones de activación y sensor de Airflow para iniciar DAG cuando ocurran ciertos eventos, como cuando se crea un nuevo archivo o cuando se inserta un nuevo registro en una base de datos.
  • Utilice las funciones de registro y métricas de Airflow para monitorear la ejecución de sus DAG y tareas.
  • Pruebe sus DAG con regularidad para asegurarse de que funcionen como se esperaba.

Si sigue estos consejos, podrá crear y mantener tuberías ETL eficientes y confiables con Airflow.