2014-10-24 18 views
6

Abbiamo un'istanza MongoDB piuttosto grande con raccolte più grandi. Ha raggiunto il punto in cui diventa troppo costoso affidarsi alle funzionalità di query di MongoDB (incluso il framework di aggregazione) per ottenere informazioni sui dati.MongoDB in AWS Redshift

Ho guardato in giro per le opzioni per rendere i dati disponibili e più facile da consumare, e hanno optato per due opzioni promettenti:

  1. AWS Redshift
  2. Hadoop Hive +

Noi voglio essere in grado di utilizzare una sintassi simile a SQL per analizzare i nostri dati, e vogliamo un accesso in tempo reale ai dati (pochi minuti la latenza va bene, non vogliamo aspettare che l'intero MongoDB si sincronizzi durante la notte) .

Per quanto posso raccogliere, per l'opzione 2, è possibile utilizzare questo https://github.com/mongodb/mongo-hadoop per spostare i dati da MongoDB a un cluster Hadoop.

Ho guardato in alto e in basso, ma non riesco a trovare una soluzione simile per far entrare MongoDB in AWS Redshift. Osservando gli articoli di Amazon, sembra che il modo corretto per farlo sia usare AWS Kinesis per ottenere i dati in Redshift. Detto questo, non riesco a trovare alcun esempio di qualcuno che abbia fatto qualcosa di simile, e non riesco a trovare librerie o connettori per spostare dati da MongoDB in un flusso Kinesis. Almeno nulla che sembra promettente.

Qualcuno ha fatto qualcosa del genere?

risposta

4

Ho finito con la codifica del nostro migratore utilizzando NodeJS. Mi sono un po 'irritato con le risposte che spiegano cos'è redshift e MongoDB, quindi ho deciso che mi prenderò il tempo per condividere ciò che dovevo fare alla fine.

dati con registrazione cronologica

Fondamentalmente abbiamo garantire che tutte le nostre collezioni MongoDB che vogliamo essere migrati a tavoli in spostamento verso il rosso sono timestamped, e indicizzati in base a tale data e ora.

Plugin ritorno cursori

Abbiamo poi codificare un plug-in per ogni migrazione che vogliamo fare da una raccolta Mongo a una tabella spostamento verso il rosso.Ogni plug-in restituisce un cursore, che prende in considerazione l'ultima data migrata (passata dal motore di migrazione) e restituisce solo i dati che sono stati modificati dall'ultima migrazione riuscita per quel plug-in.

Come i cursori sono utilizzati

Il motore migratore quindi utilizza questo cursore, e loop attraverso ogni record. Richiama il plug-in per ciascun record, per trasformare il documento in un array, che viene quindi utilizzato dal migratore per creare una linea delimitata che esegue lo streaming su un file su disco. Utilizziamo le schede per delimitare questo file, poiché i nostri dati contenevano molte virgole e pipe.

esportazioni delimitati da S3 in una tabella sul redshift

Il migratore quindi carica il file delimitato su S3, ed esegue il comando di spostamento verso il rosso copia per caricare il file da S3 in una tabella temporanea, utilizzando la configurazione del plugin per ottenere il nome e una convenzione per denotarlo come un tavolo temporaneo.

Così, ad esempio, se avessi un plug-in configurato con un nome di tabella di employees, creerebbe una tabella temporanea con il nome di temp_employees.

Ora abbiamo dati in questa tabella temporanea. E i record in questa tabella temporanea ottengono i loro id dalla raccolta MongoDB di origine. Questo ci consente di eseguire un'eliminazione sulla tabella di destinazione, nel nostro esempio, la tabella dei dipendenti, in cui l'ID è presente nella tabella temporanea. Se nessuna tabella non esiste, viene creata al volo, in base a uno schema fornito dal plug-in. E così arriviamo a inserire tutti i record dalla tabella temporanea nella tabella di destinazione. Questo approvvigiona sia per i nuovi record sia per i record aggiornati. Facciamo solo soft delete sui nostri dati, quindi verrà aggiornato con un flag is_deleted in redshift.

Una volta completato l'intero processo, il motore di migrazione memorizza un timestamp per il plug-in in una tabella redshift, al fine di tenere traccia di quando l'ultima migrazione è stata eseguita correttamente. Questo valore viene quindi passato al plug-in la prossima volta che il motore decide di migrare i dati, consentendo al plug-in di utilizzare il timestamp nel cursore che deve fornire al motore.

Quindi, in sintesi, ogni plugin/migrazione fornisce la seguente al motore:

  • un cursore, che utilizza opzionalmente l'ultima data migrato passata ad esso dal motore, al fine di garantire che solo i delta vengono spostati across.
  • Una funzione di trasformazione, utilizzata dal motore per trasformare ciascun documento del cursore in una stringa delimitata, che viene aggiunta a un file di esportazione
  • Un file di schema, questo è un file SQL che contiene lo schema per la tabella su redshift
2

Redshift è un prodotto di alloggiamento del data ware e Mongo DB è un DB NoSQL. Chiaramente, non sono una sostituzione l'uno dell'altro e possono coesistere e servire a scopi diversi. Ora come salvare e aggiornare i record in entrambi i posti. È possibile spostare tutti i dati di Mongo DB su Redshift come attività singola. Redshift non è adatto per la scrittura in tempo reale. Per Near Real Time Sync to Redshift, è necessario modificare il programma che scrive in Mongo DB. Lascia che quel programma scriva anche nelle locazioni S3. La posizione S3 per spostare il movimento verso il rosso può essere eseguita a intervalli regolari.

0

Poiché Mongo DB è un motore di archiviazione di documenti, Apache Solr, Elastic Search può essere considerato come possibile sostituzione. Ma non supportano le funzionalità di query di tipo SQL. Fondamentalmente usano un meccanismo di filtraggio diverso. Ad esempio, per Solr, potrebbe essere necessario utilizzare il filtro Dismax.

Sul cloud, la ricerca cloud/ricerca di Azure di Amazon sono opzioni convincenti da provare.

Problemi correlati