Il Docker Compose di ETL Meerschaum Compose
Meerschaum Compose ETL Docker Compose
Questo articolo parla di Meerschaum Compose, uno strumento per definire pipeline ETL in YAML e un plugin per il framework di ingegneria dei dati Meerschaum.
Docker è stato un game-changer, rivoluzionando il modo in cui progettiamo, costruiamo ed eseguiamo le nostre applicazioni cloud. Tuttavia, molto presto, gli sviluppatori si sono resi conto che la sua flessibilità rendeva difficile la collaborazione, quindi docker-compose
è diventato lo strumento preferito per gestire gli ambienti e i progetti multi-container.
In una vena simile, anche per il framework ETL Meerschaum è emerso il problema di avere ambienti consistenti. Man mano che sempre più ingegneri dei dati costruivano le loro pipeline utilizzando la piattaforma, la natura dinamica dei flussi significava che era necessaria una soluzione per fornire l’isolamento a livello di progetto.
Ispirandosi a Docker Compose, questa soluzione è venuta sotto forma di un progetto chiamato Meerschaum Compose. Uso Compose quotidianamente sia al lavoro che per i miei progetti personali per costruire e gestire le mie pipeline dati e oggi vorrei mostrare come è possibile costruire i propri progetti ETL con Compose.
- Utilizzando RAPIDS cuDF per sfruttare la GPU nell’ingegneria delle feature.
- Sviluppare e testare le regole RLS in Power BI
- Le 3 competenze tecniche essenziali che ogni leader dei dati ha bisogno per avere successo
Come Compose doma il motore
Con grande potere viene grande responsabilità e, nel caso di Docker, questa responsabilità è gestita da un file di manifesto chiamato docker-compose.yml
, che descrive come i servizi all’interno di un’applicazione dovrebbero essere eseguiti. Questo file agisce come documentazione in continua evoluzione che facilita la prototipazione e descrive gli ambienti previsti per CloudOps. Attraverso uno standard semplice, Docker Compose colma le lacune nel processo di sviluppo fornendo un modo conveniente per standardizzare e condividere ambienti per progetti multi-servizio.
Meerschaum Compose ha uno scopo simile: in un file mrsm-compose.yml
, si specifica tutto ciò di cui potrebbe avere bisogno un progetto: l’ambiente previsto, i plugin, i flussi e i connettori.
Comandi
Quando si incontra un nuovo progetto Compose (utilizzando il progetto demo Tech Slam ‘N Eggs nelle immagini qui sotto), provare questi comandi per prendere confidenza:
Nota: vedere questo repository se si desidera eseguire Compose in un contenitore Docker.
mrsm compose run
Registra i flussi e li sincronizza uno per uno. Questo è ottimo per garantire l’ordine di esecuzione e l’aggiornamento dei parametri dei flussi con il database. Un pattern comune è concatenare diverse fasi in file di composizione separati come parte di un processo ETL più 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: il comando
mrsm compose sync pipes
è parallelizzato ed è meglio utilizzato se i flussi all’interno del file di composizione sono indipendenti.

mrsm compose explain
Parserizza il file Compose e stampa l’ambiente corrente e lo stato dei flussi definiti. Questo è utile per risolvere i problemi e capire la struttura di un progetto.

mrsm compose up --dry
Registra e aggiorna i parametri dei flussi remoti. Questo viene eseguito implicitamente come parte di mrsm compose run
e dovrebbe essere eseguito prima delle azioni standard Meerschaum come mrsm compose sync pipes
. Il flag --dry
impedisce l’esecuzione delle attività di sincronizzazione.
Nota: Compose etichetterà i flussi con il nome del progetto. Impostare la chiave
project_name
se si utilizzano più file di composizione all’interno di un progetto.
mrsm compose down -v
Ferma i lavori e cancella le pipe. Questo è analogo a docker compose down -v
(ovvero -v
per “volumi”).
mrsm compose <azione>
Esegue le azioni standard di Meerschaum dall’ambiente del progetto (ad esempio, sync pipes
, delete pipes
, azioni personalizzate). Spesso eseguo mrsm compose python
per accedere a una REPL all’interno dell’ambiente del progetto.
Ogni volta che si esegue un’azione con mrsm compose
, il flag --tags {nome_progetto}
viene aggiunto (a meno che non sia sovrascritto) per assicurarsi che si interagisca solo con le pipe all’interno del progetto.

Pipes
L’umile pipe è l’astrazione di Meerschaum per ETL incrementale. Le pipe hanno connettori di input e output e memorizzano i parametri per configurare il comportamento dei loro processi di sincronizzazione. Questo può essere semplice come una query SQL o può includere chiavi personalizzate per l’uso nei plugin.

Poiché i metadati delle pipe sono memorizzati insieme alle loro tabelle, sono facilmente modificabili (sia tramite edit pipes
che tramite l’interfaccia web), il che facilita il prototipazione. Ma questa natura dinamica introduce lo stesso problema descritto all’inizio di questo articolo: per scalare lo sviluppo, è necessario un file Compose per definire i componenti di un progetto in modo che possano essere facilmente versionati.
Secondo la specifica Meerschaum Compose, le pipe sono definite in una lista sotto le chiavi sync:pipes
. Ogni elemento definisce le chiavi e i parametri necessari per costruire la pipe, come una sorta di modello per ciò che ci si aspetta che le pipe nel database riflettano.
Ad esempio, il seguente snippet definirebbe una pipe che sincronizzerebbe una tabella weather
da un database PostgreSQL remoto (definito di seguito come sql:source
) in un file SQLite locale (sql:dest
in questo progetto).
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"
Questo esempio aggiornerebbe incrementalmente una tabella chiamata weather
utilizzando l’asse datetime timestamp
per la limitazione dell’intervallo (1 giorno di backtracking), e questa colonna più la colonna ID station
insieme costituirebbero una chiave primaria composita utilizzata per la deduplicazione.
L’URI è scritto letteralmente solo come esempio. Se si sta commitando un file Compose, fare riferimento a una variabile d’ambiente (ad esempio,
$SECRET_URI
) o alla configurazione Meerschaum dell’host (ad esempio,MRSM{meerschaum:connectors:sql:source}
).
Connettori
Prima di tutto, un breve ripasso sui connettori di Meerschaum: è possibile definire i connettori in diversi modi, il più popolare dei quali è attraverso le variabili d’ambiente. Supponiamo di definire le credenziali di connessione in un file di ambiente:
export MRSM_SQL_REMOTE='postgresql://user:pass@host:5432/db'export MRSM_FOO_BAR='{ "user": "abc", "password": "def"}'
La prima variabile d’ambiente MRSM_SQL_REMOTE
definisce il connettore sql:remote
. Se si utilizza questo file, è possibile verificare questo connettore con il comando mrsm show connectors sql:remote
.
La seconda variabile è un esempio di come definire un FooConnector
personalizzato, che si può creare utilizzando il decoratore @make_connector
in un plugin. I connettori personalizzati sono uno strumento potente, ma per ora, ecco la struttura di base:
from meerschaum.connectors import make_connector, Connector@make_connectorclass FooConnector(Connector): REQUIRED_ATTRIBUTES = ['username', 'password'] def fetch(pipe, **kwargs): docs = [] return docs
Abbiamo appena visto come definire i connettori nel nostro ambiente host. Vediamo ora come rendere questi connettori host disponibili in un progetto Meerschaum. Nel file di composizione, tutti i connettori necessari per il nostro progetto sono definiti in config:meerschaum:connectors
. Utilizzare la sintassi MRSM{}
per fare riferimento alle chiavi del proprio ambiente host e passarle al progetto.
config: meerschaum: instance: "sql:app" connectors: sql: app: MRSM{meerschaum:connectors:sql:remote} foo: bar: MRSM{meerschaum:connectors:foo:bar}
Plugin
Meerschaum è facilmente estendibile tramite i plugin, che sono moduli Python. I plugin possono recuperare dati, implementare connettori personalizzati e/o estendere Meerschaum (ad esempio, azioni personalizzate, flag, endpoint API, ecc.).
Meerschaum supporta più directory di plugin (tramite
MRSM_PLUGINS_DIR
), che possono essere impostate sotto la chiaveplugins_dir
inmrsm-compose.yaml
(la directory predefinita è una directoryplugins
).
Conservare i propri plugin all’interno di un progetto Compose rende chiaro come si prevede che i plugin vengano utilizzati. Ad esempio, il file di composizione del progetto MongoDBConnector mostra come il connettore personalizzato viene utilizzato come connettore e come istanza.
Gestione dei pacchetti
Quando si inizia a utilizzare Meerschaum Compose, la prima cosa che si nota è che inizierà a installare una quantità considerevole di pacchetti Python. Non preoccuparsi del proprio ambiente, poiché tutto viene installato in ambienti virtuali all’interno della sottodirectory root
del proprio progetto (un po’ ironico, vero?). È possibile installare le dipendenze dei propri plugin con mrsm compose init
.
Per condividere i pacchetti tra progetti, impostare la chiave root_dir
in mrsm-compose.yml
su un nuovo percorso. L’eliminazione di questa directory root
disinstalla effettivamente tutti i pacchetti scaricati da Compose, mantenendo integro l’ambiente host.
Conclusioni
Meerschaum Compose è diventato il mio strumento preferito per sviluppare i progetti ETL a scala Nisoo. Ha un flusso di lavoro simile a Meltano o dbt, ma con una barriera d’ingresso più bassa e un controllo più dinamico sul processo ETL. È un flusso di lavoro interessante per organizzare i plugin, i connettori e le pipe in modo che funzionino bene in un team.
È possibile avviare rapidamente un nuovo progetto con il repository di modelli Meerschaum Compose ― vedere il plugin MongoDBConnector o la demo Tech Slam ‘N Eggs per esempi pratici.
Sentitevi liberi di aggiungere il proprio progetto alla lista Awesome Meerschaum!