Come archiviare in modo efficiente i dati di grandi serie temporali?

26

Ho bisogno di archiviare e di essere in grado di interrogare dati di serie temporali molto grandi.

Le proprietà dei dati sono le seguenti:

  • numero di serie: circa 12.000 (dodicimila)
  • numero di punti dati, a livello globale: circa 500.000.000 al mese (cinquecento milioni)
  • tipi di valori misti: la maggior parte dei punti dati sono valori in virgola mobile, il resto sono stringhe
  • periodo di campionamento: variabile tra serie e all'interno di una serie
  • timestamp: precisione millisecondo
  • Periodo di conservazione dei dati: diversi anni, senza decadimento o sottocampionamento
  • gli archivi di dati devono essere costruiti quasi in tempo reale, ma è accettabile un ragionevole ritardo (~ 1 ora)
  • i dati passati possono essere ricostruiti se necessario, ma a un costo elevato
  • a volte, ma molto raramente, alcuni dati passati devono essere aggiornati

Proprietà delle query previste:

  • la maggior parte delle query relative ai dati saranno query basate su data / ora; che vanno da un giorno a diversi mesi / anni. Il 90% + sarà interrogato sui dati più recenti

Altri requisiti:

  • la soluzione deve essere libera come nella birra gratis e preferibilmente opensource

Il mio pensiero iniziale era di usare PyTables / Pandas con file HDF5 come archivio di back-end invece di un database SQL.

Domande:

  1. Supponendo che PyTables / Pandas sia la "migliore" route, sarebbe meglio suddividere i dati in diversi file HDF, ognuno dei quali si estende per un dato periodo di tempo, o mettere tutto in un singolo file che sarebbe poi diventato enorme?

  2. Devo andare e preferire il formato fisso o il formato tabella? Per me, il formato fisso sembra OK se tengo un file HDF al mese, in questo modo probabilmente un'intera serie si adatta RAM e I possono tagliare in-memory senza bisogno di un indice di formato tabella. Sono corretto?

E se questo è non l'approccio migliore, come dovrei strutturare questo archivio dati o quali tecnologie dovrei considerare? Non sono il primo ad occuparmi di archiviare grandi serie di dati di serie temporali, qual è l'approccio generale per risolvere questa sfida?

Altri approcci che ho considerato:

  • database di array: si adattano perfettamente alle serie temporali con un periodo di campionamento costante, in quanto è sufficiente memorizzare solo le ore di inizio e di fine e il periodo di campionamento dell'array, quindi è semplice utilizzare solo i valori nell'array stesso e l'indicizzazione. Ma con periodi di campionamento variabili all'interno delle serie stesse, ho bisogno di mantenere una relazione di valore temporale più stretta, che a mio modo di vedere non è così adatta per il DBMS di array.
  • database SQL standard con timestamp, paramID, valore come colonne ma per loro natura richiedono molti I / O su disco per qualsiasi query
posta flyingmig 08.01.2015 - 14:11
fonte

3 risposte

5

Potresti dare un'occhiata a carbonio e whisper , parte del progetto graphite . Il carbonio può gestire quantità molto elevate di dati di serie temporali. Però, ora che ho letto i documenti (sono passati alcuni anni da quando l'ho usato), è solo per i dati numerici. Hai detto che hai anche dati sulle stringhe, quindi potresti non trovarlo utile. Tuttavia, potresti essere in grado di raccogliere un po 'di saggezza su come sono in grado di elaborare rapidamente grandi quantità di dati.

Per darti un'idea di come si ridimensiona, quando la grafite è stata messa in produzione per la prima volta in Orbitz, gestiva 160.000 metriche per minuto .

    
risposta data 09.01.2015 - 23:13
fonte
3

InfluxDB è un database open source scritto in Go. È stato scritto appositamente per gestire i dati delle serie temporali e hanno pubblicato i benchmark che mostrano prestazioni molto migliori contro Cassandra :

InfluxDB outperformed Cassandra in all three tests with 4.5x greater write throughput, while using 10.8x less disk space, and delivering up to 168x faster response times for tested queries.

    
risposta data 09.09.2016 - 10:46
fonte
2

potresti voler controllare i database orientati alle colonne. Non sono sicuro di cosa intendi per database di array, ma con il mio approccio suggerito puoi avere un numero dinamico di valori per intervallo di tempo. Puoi anche avere più valori per lo stesso timestamp. La parte interessante è che se si hanno valori misurati con lo stesso timestamp, è possibile salvarli come colonne aggiuntive (ad esempio un sensore che misura la temperatura e l'umidità, nel prezzo di scambio e nelle dimensioni di un commercio, ...). A causa della natura orientata alla colonna puoi avere tabelle con 100 colonne ma se la tua query accede solo a cinque colonne il database legge solo i dati delle cinque colonne.

Ho scritto una serie sulla creazione del tuo database di serie temporali, potresti volerlo dare un'occhiata:

risposta data 06.02.2015 - 08:01
fonte

Leggi altre domande sui tag