Modifica
Sto lavorando a un progetto per aggiornare un'infrastruttura ETL legacy che supporta un numero di client, ognuno con un'impostazione leggermente diversa.
Vincoli che non possono essere modificati:
- I dati sorgente possono provenire da file flat su sftp e quindi su S3, da database MSSQL o eventi pubblicati tramite webhooks.
- Fondi di dati di origine con dimensioni da ~ 60 GB a ~ 1 TB di dimensioni. Anche se stiamo acquisendo diffs che sono generalmente > 5 GB in dimensioni totali. E i database finali per i nostri clienti sono grosso modo uguali.
- La destinazione corrente per tutti i nostri dati è duplice: un database MySQL (uno per ogni client, può o non può essere su un server condiviso) e il secondo, un set filtrato di dati memorizzati in un file sql su S3 .
Il sistema esistente è progettato per caricare solo dati da file, quindi anche quando disponiamo di dati in un'istanza RSS MSSQL, prima estraiamo i dati in una serie di file da elaborare. I dati vengono quindi caricati tramite il comando MySQL LOAD DATA INFILE
, le tranform eseguite per ottenere i dati grezzi dal sistema di origine collegato ai dati nel nostro sistema e infine i dati vengono spostati dalle tabelle di staging alle tabelle di produzione. Non stiamo facendo alcuna aggregazione e quindi tutti i dati rimangono molto vicini alla sua forma grezza.
Un grande problema che abbiamo con questi sistemi esistenti è che man mano che i dati crescono siamo costretti ad aumentare la quantità di RAM in particolare perché le prestazioni delle query diminuiscono in MySQL dato che i dati non possono più essere archiviati in memoria.
Nella ricerca di possibili soluzioni, sono giunto alla conclusione che parallelizzare le attività ETL utilizzando i micro-batch sarebbe un approccio migliore poiché dovrebbe consentirci di elaborare set di dati sempre più grandi senza un aumento lineare dei costi e / o dei tempi di elaborazione.
/ Modifica
Il nostro team di Devops è piuttosto investito nell'ecosistema di AWS quindi mi sono concentrato sull'utilizzo di AWS Lambda per l'elaborazione parallela. Ho trovato alcuni post che parlano dell'utilizzo della tecnica MapReduce con AWS Lambda per eseguire l'elaborazione dei dati.
Quello che mi chiedo è se Lambda con una soluzione simile a MapReduce sia davvero la soluzione corretta quando sto solo spostando, filtrando e trasformando i dati e non costruendo alcun tipo di indici aggregati?