Comment stocker efficacement des données de grandes séries temporelles?

27

J'ai besoin de stocker et de pouvoir interroger des données de séries chronologiques de très grandes quantités.

Les propriétés des données sont les suivantes:

  • nombre de séries: environ 12.000 (douze mille)
  • nombre de points de données, globalement: environ 500.000.000 par mois (cinq cent millions)
  • types de valeurs mixtes: la majorité des points de données sont des valeurs à virgule flottante, les autres sont des chaînes
  • période d'échantillonnage: variable entre les séries ainsi qu'au sein d'une série
  • horodatage: précision en millisecondes
  • période de conservation des données: plusieurs années, sans décroissance ni sous-échantillonnage
  • les archives de données doivent être construites presque en temps réel, mais un délai raisonnable (~ 1 heure) est acceptable
  • les données passées peuvent être reconstruites si nécessaire, mais à un coût élevé
  • parfois, mais assez rarement, certaines données antérieures doivent être mises à jour

Propriétés des requêtes envisagées:

  • la plupart des requêtes sur les données seront des requêtes basées sur l'horodatage; allant d'un jour à plusieurs mois / années. 90% + seront des requêtes sur les données les plus récentes

Autres exigences:

  • la solution doit être libre comme dans la bière gratuite et de préférence opensource

Ma pensée initiale a été d'utiliser PyTables / Pandas avec des fichiers HDF5 comme stockage de backend au lieu d'une base de données SQL.

Des questions :

  1. En supposant que PyTables / Pandas est la "meilleure" route, serait-il préférable de diviser les données en plusieurs fichiers HDF, chacun s'étendant sur une période de temps donnée, ou de tout mettre dans un seul fichier qui deviendrait alors énorme?

  2. Dois-je aller préférer le format fixe ou le format tableau? Pour moi, le format fixe semble OK si je garde un fichier HDF par mois, car de cette façon, toute une série tient probablement dans la RAM et je peux découper en mémoire sans avoir besoin d'un index de format de table. Ai-je raison ?

Et si ce n'est pas la meilleure approche, comment dois-je structurer ce magasin de données ou quelles technologies dois-je envisager? Je ne suis pas le premier à aborder le stockage de grands ensembles de données de séries chronologiques, quelle est l'approche générale pour résoudre ce défi?


Autres approches que j'ai envisagées:

  • bases de données de tableaux: ils conviennent parfaitement aux séries chronologiques avec une période d'échantillonnage constante, car vous n'avez alors qu'à stocker les heures de début et de fin et la période d'échantillonnage du tableau, puis seules les valeurs dans le tableau lui-même et l'indexation sont faciles. Mais avec des périodes d'échantillonnage variables dans les séries elles-mêmes, je dois garder une relation d'horodatage-> valeur plus étroite, qui, à mon avis, n'est pas si adaptée aux SGBD de tableau.
  • base de données SQL standard avec horodatage, paramID, valeur sous forme de colonnes mais de par leur nature, ils demandent beaucoup d'E / S disque pour toute requête
flyingmig
la source
Vous devriez considérer les bases de données de tableaux - en.wikipedia.org/wiki/Array_DBMS#List_of_Array_DBMS . Je ne dis pas que l'un d'eux serait la bonne, ou même la meilleure ou même une assez bonne réponse, juste qu'ils devraient entrer dans vos pensées. Outre les entrées de cette liste, il existe le système kdb ( kx.com ) bien qu'il soit loin d'être gratuit.
High Performance Mark
Merci pour votre participation. J'ai pris en compte les bases de données de tableaux, mais le problème que je trouve avec celles-ci est qu'elles conviennent parfaitement aux séries chronologiques avec une période d'échantillonnage constante , car vous n'avez alors qu'à stocker les heures de début et de fin et la période d'échantillonnage du tableau, puis uniquement les valeurs dans le tableau lui-même et l'indexation est facile. Mais avec des périodes d'échantillonnage variables dans les séries elles-mêmes, je dois garder une relation d'horodatage-> valeur plus étroite, qui, à mon avis, ne convient pas si bien au SGBD de tableau. Cela dit, je serais heureux d'avoir tort.
flyingmig
modification de la question pour ajouter ce que j'ai considéré jusqu'à présent
flyingmig
Question: avez-vous besoin de stocker toutes les données? Les données peuvent-elles décliner dans le temps et / ou existe-t-il un niveau de précision acceptable pour la série basée sur les flottants?
J Trana
1
@ moinuddin-quadri J'ai fini par utiliser des objets pandas DataFrame sauvegardés par des fichiers HDF5 mensuels en utilisant le format de table. Le système fonctionne depuis plus d'un an et s'est révélé très stable et rapide, sans même utiliser de disques SSD. J'essaierai de rédiger tout cela comme une réponse quand j'aurai le temps. Sinon, n'hésitez pas à me PM.
flyingmig

Réponses:

5

Vous voudrez peut-être jeter un œil au carbone et au chuchotement , une partie du projet de graphite . Le carbone peut gérer de très grandes quantités de données de séries chronologiques. Bien que maintenant que j'ai lu les documents (cela fait quelques années que je ne les ai pas utilisés), ce n'est que pour les données numériques. Vous avez dit que vous disposiez également de données de chaîne, ce qui pourrait ne pas vous être utile. Cependant, vous pourriez être en mesure de glaner une certaine sagesse sur la façon dont ils sont capables de traiter rapidement de grandes quantités de données.

Pour vous donner une idée de son évolutivité, lorsque le graphite a été mis en production pour la première fois chez Orbitz, il traitait 160 000 métriques par minute .

Bryan Oakley
la source
Merci pour la suggestion, mais d'après ma compréhension, le chuchotement ne convient pas car sa précision est la deuxième lorsque j'ai besoin d'une précision en millisecondes et comme vous l'avez souligné à juste titre, j'ai également des données de chaîne qui ne peuvent pas être stockées là-bas.
flyingmig
1
@flyingmig N'écrivez pas chuchotement si vite. Ses horodatages sont des valeurs d'époque Unix. Et les "données de chaîne" que vous avez décrites dans la question ressemblent davantage à des énumérations, et celles-ci sont généralement stockées sous forme de petites valeurs entières.
Ross Patterson
Sears utilise du carbone / graphite / Ceres pour stocker plus de 4 millions de points de données uniques par minute. Ce n'est pas parfait, et cela nécessite un clustering en graphite et des SSD, mais cela fonctionne. Toutes les autres solutions ne sont pas évolutives à ce niveau, que nous avons trouvées, mais si vous avez des idées, n'hésitez pas à y jouer.
Kevin J. Rice
3

InfluxDB est une base de données open source écrite en Go. Il a été écrit spécialement pour gérer les données de séries chronologiques, et ils ont publié des benchmarks montrant de bien meilleures performances par rapport à Cassandra :

InfluxDB a surpassé Cassandra dans les trois tests avec un débit d'écriture 4,5 fois supérieur, tout en utilisant 10,8 fois moins d'espace disque et en offrant des temps de réponse jusqu'à 168 fois plus rapides pour les requêtes testées.

Dan Dascalescu
la source
2

vous souhaiterez peut-être extraire des bases de données orientées colonnes. Je ne sais pas ce que vous entendez par bases de données de tableaux mais avec mon approche suggérée, vous pouvez avoir un nombre dynamique de valeurs par période. Vous pouvez également avoir plusieurs valeurs pour le même horodatage. La partie intéressante est que si vous avez des valeurs mesurées au même horodatage, vous pouvez les enregistrer sous forme de colonnes supplémentaires (par exemple, un capteur qui mesure la température et l'humidité, dans le cours de bourse et la taille d'un commerce, ...). En raison de la nature orientée colonnes, vous pouvez avoir des tables de 100 colonnes mais si votre requête accède uniquement à cinq colonnes, la base de données lit uniquement les données des cinq colonnes.

J'ai écrit une série sur la création de votre propre base de données de séries chronologiques, vous voudrez peut-être y jeter un œil:

hellomichibye
la source