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 :
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?
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
la source
Réponses:
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 .
la source
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 :
la source
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:
la source