El Docker Compose de ETL Meerschaum Compose

Docker Compose for ETL Meerschaum Compose.

Foto de CHUTTERSNAP en Unsplash

Este artículo trata sobre Meerschaum Compose, una herramienta para definir pipelines ETL en YAML y un plugin para el marco de ingeniería de datos Meerschaum.

Docker fue un cambio de juego, revolucionando la forma en que diseñamos, construimos y ejecutamos nuestras aplicaciones en la nube. Sin embargo, desde el principio, los desarrolladores se dieron cuenta de que su flexibilidad dificultaba la colaboración, por lo que docker-compose se convirtió en la herramienta preferida para administrar entornos y proyectos de varios contenedores.

En una línea similar, este problema de entornos consistentes también surgió para el marco ETL Meerschaum. A medida que más ingenieros de datos construían sus pipelines utilizando la plataforma, la naturaleza dinámica de los pipes significaba que se necesitaba una solución para proporcionar el aislamiento a nivel de proyecto.

Inspirado en Docker Compose, esta solución llegó en forma de un proyecto llamado Meerschaum Compose. Uso Compose diariamente en mi trabajo y para mis proyectos personales para construir y administrar mis pipelines de datos, y hoy me gustaría mostrar cómo puede construir sus proyectos ETL con Compose.

Cómo Compose doma el motor

Con un gran poder viene una gran responsabilidad, y en el caso de Docker, esta responsabilidad es manejada por un archivo de manifiesto llamado docker-compose.yml que describe cómo deben ejecutarse los servicios dentro de una aplicación. Este archivo actúa como documentación viva que facilita la creación de prototipos y describe los entornos esperados para CloudOps. A través de un estándar simple, Docker Compose llena los vacíos en el proceso de desarrollo al proporcionar una forma conveniente de estandarizar y compartir entornos para proyectos de varios servicios.

Meerschaum Compose sirve un propósito similar: en un archivo mrsm-compose.yml, especifica todo lo que pueda necesitar para un proyecto: el entorno esperado, plugins, pipes y conectores.

Comandos

Cuando se encuentra con un nuevo proyecto Compose (usando el proyecto de demostración de Tech Slam ‘N Eggs en las capturas de pantalla a continuación), pruebe estos comandos para ubicarse:

Nota: consulte este repositorio si desea ejecutar Compose en un contenedor Docker.

mrsm compose run Registra los pipes y los sincroniza uno por uno. Esto es excelente para garantizar el orden de ejecución y actualizar los parámetros de los pipes con la base de datos. Un patrón común es concatenar varias etapas en archivos Compose separados como parte de un proceso ETL más grande:

mrsm compose run --file mrsm-compose-00-extract.yaml && \mrsm compose run --file mrsm-compose-01-transform.yaml && \mrsm compose run --file mrsm-compose-02-load.yaml

Nota: el comando mrsm compose sync pipes está paralelizado y es mejor usarlo si los pipes dentro del archivo Compose son independientes.

El comando compose run sincroniza los pipes uno por uno.

mrsm compose explain Analiza el archivo Compose e imprime el entorno actual y el estado de los pipes definidos. Esto es útil para solucionar problemas y comprender la estructura de un proyecto.

El comando compose explain imprime el estado de los pipes definidos.

mrsm compose up --dry Registra y actualiza los parámetros de los pipes remotos. Esto se ejecuta implícitamente como parte de mrsm compose run y debe ejecutarse antes de las acciones estándar de Meerschaum, como mrsm compose sync pipes. La bandera --dry evita que se ejecuten trabajos de sincronización.

Nota: Compose etiquetará los pipes con el nombre del proyecto. Configure la clave project_name si utiliza varios archivos Compose dentro de un proyecto.

mrsm compose down -v detiene trabajos y elimina tuberías. Esto es análogo a docker compose down -v (es decir, -v para “volúmenes”).

mrsm compose <action> ejecuta acciones estándar de Meerschaum desde el entorno del proyecto (por ejemplo, sync pipes, delete pipes, acciones personalizadas). A menudo ejecuto mrsm compose python para acceder a un REPL dentro del entorno del proyecto.

Cada vez que se ejecuta una acción con mrsm compose, se agrega la bandera --tags {project_name} (a menos que se anule) para asegurarse de que solo interactúa con las tuberías dentro del proyecto.

Un ejemplo de proyecto Meerschaum Compose para ETL en datos meteorológicos.

Tuberías

La humilde tubería es la abstracción de Meerschaum para ETL incremental. Las tuberías tienen conectores de entrada y salida y almacenan parámetros para configurar el comportamiento de sus procesos de sincronización. Esto puede ser tan simple como una consulta SQL o puede incluir claves personalizadas para usar en tus plugins.

Tuberías del proyecto Compose anterior mostradas por la interfaz de usuario web

Como los metadatos de las tuberías se almacenan junto a sus tablas, son fácilmente editables (ya sea mediante edit pipes o en la interfaz de usuario web), lo que facilita el prototipado. Pero esta naturaleza dinámica introduce el mismo problema descrito al principio de este artículo: para escalar el desarrollo, se necesita un archivo Compose para definir los componentes de un proyecto de una manera que pueda ser fácilmente controlada por versiones.

Según la especificación Meerschaum Compose, las tuberías se definen en una lista bajo las claves sync:pipes. Cada elemento define las claves y parámetros necesarios para construir la tubería, como un plano de lo que se espera que las tuberías en la base de datos reflejen.

Por ejemplo, el siguiente fragmento definiría una tubería que sincronizaría una tabla weather desde una base de datos remota PostgreSQL (definida a continuación como sql:source) a un archivo SQLite local (sql:dest en este proyecto).

sync:  pipes:    - connector: "sql:source"      metric: "weather"      target: "weather"      columns:        datetime: "timestamp"        station: "station"      parameters:        fetch:          backtrack_minutes: 1440        query: |-          SELECT timestamp, station, temperature          FROM weatherconfig:  meerschaum:    instance: "sql:dest"    connectors:      sql:        source: "postgresql://user:pass@host:5432/db"        dest: "sqlite:////tmp/dest.db"

Este ejemplo actualizaría incrementalmente una tabla llamada weather usando el eje de fecha y hora timestamp para la delimitación de rango (1 día de retroceso), y esta columna más la columna de ID station juntas conformarían una clave primaria compuesta utilizada para la deduplicación.

La URI se escribe literalmente solo como ejemplo; si está comprometiendo un archivo Compose, haga referencia a una variable de entorno (por ejemplo, $SECRET_URI) o a su configuración de Meerschaum host (por ejemplo, MRSM{meerschaum:connectors:sql:source}).

Conectores

En primer lugar, un recordatorio rápido sobre los conectores de Meerschaum: puedes definir conectores de varias formas, la más popular de las cuales es a través de variables de entorno. Supongamos que defines tus secretos de conexión en un archivo de entorno:

export MRSM_SQL_REMOTE='postgresql://user:pass@host:5432/db'export MRSM_FOO_BAR='{    "user": "abc",    "password": "def"}'

La primera variable de entorno MRSM_SQL_REMOTE definiría el conector sql:remote. Si cargaste este archivo, podrías verificar este conector con el comando mrsm show connectors sql:remote.

La segunda variable es un ejemplo de cómo definir un FooConnector personalizado, que podrías crear usando el decorador @make_connector en un plugin. Los conectores personalizados son una herramienta poderosa, pero por ahora, aquí está la estructura básica:

from meerschaum.connectors import make_connector, Connector@make_connectorclass FooConnector(Connector):    REQUIRED_ATTRIBUTES = ['username', 'password']    def fetch(pipe, **kwargs):        docs = []        return docs

Entonces acabamos de revisar cómo definir conectores en nuestro entorno de host. Veamos cómo hacer que estos conectores de host estén disponibles en un proyecto de Meerschaum. En el archivo de composición, todos los conectores que necesitamos para nuestro proyecto se definen en config: meerschaum:connectors. Usa la sintaxis MRSM{} para hacer referencia a las claves de tu entorno de host y pasarlas al proyecto.

config:  meerschaum:    instance: "sql:app"    connectors:      sql:        app: MRSM{meerschaum:connectors:sql:remote}      foo:        bar: MRSM{meerschaum:connectors:foo:bar}

Plugins

Meerschaum es fácilmente extensible a través de plugins, que son módulos de Python. Los plugins pueden obtener datos, implementar conectores personalizados y/o extender Meerschaum (p. ej. acciones personalizadas, indicadores, puntos finales de API, etc.).

Meerschaum admite múltiples directorios de plugins (a través de MRSM_PLUGINS_DIR), que se pueden configurar en la clave plugins_dir en mrsm-compose.yaml (el valor predeterminado es un directorio plugins).

Almacenar tus plugins dentro de un proyecto de Composición hace que sea claro cómo esperas que se utilicen tus plugins. Por ejemplo, el archivo de composición dentro del proyecto MongoDBConnector demuestra cómo se utiliza el conector personalizado como un conector y como una instancia.

Gestión de paquetes

Cuando comiences a usar Meerschaum Compose, lo primero que notarás es que comenzará a instalar una cantidad justa de paquetes de Python. No te preocupes por tu entorno, todo se instala en entornos virtuales dentro del subdirectorio root de tu proyecto (un poco irónico, ¿verdad?). Puedes instalar las dependencias de tus plugins con mrsm compose init.

Para compartir paquetes entre proyectos, establece la clave root_dir en mrsm-compose.yml en una nueva ruta. Eliminar este directorio root desinstalará efectivamente todos los paquetes que Compose descargó, manteniendo intacto tu entorno de host.

Conclusión

Meerschaum Compose se ha convertido en mi herramienta preferida para construir mis proyectos de ETL a escala Zepes. Tiene un flujo de trabajo similar a Meltano o dbt, pero con una barrera de entrada más baja y un control más dinámico sobre el proceso de ETL. Es un flujo de trabajo interesante para organizar plugins, conectores y pipes de una manera que funciona bien en equipo.

Puedes iniciar rápidamente un nuevo proyecto con el repositorio de plantillas de Meerschaum Compose ― consulta el plugin MongoDBConnector o la demostración Tech Slam ‘N Eggs para ver ejemplos prácticos.

¡Siéntete libre de agregar tu proyecto a la lista Awesome Meerschaum!