El Docker Compose de ETL Meerschaum Compose
Docker Compose for ETL Meerschaum Compose.
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.
- 6 casos de uso en Python donde * y ** son útiles
- Las 3 habilidades técnicas esenciales que todo líder de datos neces...
- Revitalización del Análisis de Datos OpenAI, LangChain y LlamaIndex...
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.

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.

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.

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.

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 claveplugins_dir
enmrsm-compose.yaml
(el valor predeterminado es un directorioplugins
).
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!