Comment gérer les requêtes de plus de 500 millions d'articles

8

La structure de mes données est la suivante:

date: <timestamp>
filter_a: <integer> -> range [0, 1000]
filter_b: <integer> -> range [0, 1000]
filter_c: <integer> -> range [0, 86400]
filter_d: <integer> -> range [0, 6]
group: <string>
second_group: <integer>
variable_a: <float>
variable_b: <float>
variable_c: <float>
a couple more no very important

J'ai besoin d'effectuer les requêtes suivantes:

Première:

  • Filtrer les données par date, filter_a, filter_b, filter_cet d' autres

Deuxièmement, avec les données filtrées:

  • compter tous les enregistrements
  • obtenir la moyenne de variable_a, variable_betvariable_c
  • obtenir l' écart-type de variable_a, variable_betvariable_c
  • obtenir des quartiles de variable_a, variable_betvariable_c
  • regrouper les données par groupou second_groupet agréger (Count, Avg, Std, ..)

Le nombre des utilisateurs du système est d' environ 10 ou 15, mais le nombre d'éléments est énorme, il est en ce moment 70M mais il sera 500M dans quelques semaines et il sera 1000M dans environ un an.

Le nombre de requêtes est petit, pas plus de 10 utilisateurs simultanément, mon problème est de savoir comment gérer ces requêtes avec cette énorme quantité de données.

Qu'est-ce que j'ai essayé jusqu'à présent?

  • J'ai commencé par mongodb, au début c'était rapide mais ça devenait lent lors du calcul des quartiles avec 10M +. Cela s'est amélioré lorsque j'ai ajouté des index, mais cela n'a pas beaucoup aidé lorsque j'ai dû interroger toutes les données. J'ai commencé à utiliser mongodb car les données étaient très dynamiques mais heureusement le format des données "ne va plus changer".

  • Comme filter_aet filter_bpourrait être vu comme des noeuds, j'ai essayé neo4j. Je l'ai beaucoup aimé neo4j mais mon graphique avait BEAUCOUP d'arêtes pour que les requêtes ne soient pas très rapides.

  • Enfin, comme le format des données ne changera pas et qu'il ne s'agit que d'une seule collection / table, il ne nécessite donc aucune jointure dans SQL, j'ai vérifié postgresql. Mes tests ont été plus rapides avec postgresql, mais j'ai peur qu'il ne puisse pas évoluer correctement à l'avenir.

De quoi ai-je besoin?

  • Le postgresql est-il un bon choix pour ce cas?
  • Y a-t-il un autre type de base de données que je pourrais utiliser? lequel est le meilleur pour ce cas?
  • Que pouvais-je faire d'autre pour l'améliorer?

Éditer

  • Environ 1 million d'éléments sont insérés chaque jour et «ne devraient pas changer» au fil du temps.
  • La vitesse d'écriture n'est pas importante
  • L'exigence difficile est de lire / agréger rapidement

Merci!

Andres
la source
1
Qu'en est-il des vues indexées dans SQL Server / des vues métastasées dans Oracle? Ce sont des agrégats en cours d'exécution de la table de base, de sorte que lorsque la table de base est modifiée, l'index est également modifié à la volée. Ensuite, vous pouvez toujours interroger des agrégats déjà calculés pour vous.
Ali Razeghi
Les vues indexées @AliRazeghi sont une bonne idée. Quoi qu'il en soit, je veux d'abord choisir la meilleure base de données / conception avant d'optimiser les requêtes lui
Andres
1
Pour l'optimisation purement dans Postgres, je veux dire que les index BRIN pourraient aider ici, mais je n'ai rien fait à part lire à leur sujet. postgresql.org/docs/9.5/static/brin-intro.html
Erik Darling
1
Personnellement, j'ai hérité d'une base de données de génération de rapports de plusieurs milliards de dollars sur un serveur OLTP sans beaucoup de mémoire. Heureusement, les parties les plus interrogées étaient des «dernières 3 semaines», mais les scans de table n'étaient pas inconnus. Honnêtement, en utilisant une très bonne compression, un partitionnement, une élimination de partition, un schéma de partitionnement, des optimisations de cache SAN et la suppression des index inutilisés, nous avons obtenu de très bonnes performances sur MS SQL 2008 Ent. 1 milliard ne sera pas trop difficile pour PGSQL. Quelle est la largeur de chaque ligne ou approximativement combien d'espace pensez-vous que chaque ligne prendra, et combien d'index y aura-t-il par table ou processus d'entrée?
Ali Razeghi
2
@Andres, cela dépend du moteur de base de données dans lequel il se trouve et de la taille maximale de chaque ligne afin que nous puissions calculer. Par exemple, PostgreSQL a varchar et juste char, char est facile à calculer, varchar nous devrons deviner la longueur moyenne. Si nous pouvions savoir de quel type de champ il s'agit (sauf s'il s'agit de Mongo ou de quelque chose qui le stocke dans un document avec son propre format), combien de caractères nous attendons dans chacun et # d'index avec les colonnes. 8 Go de RAM semble être trop faible pour le retirer efficacement de la mémoire, surtout si cette RAM est partagée avec d'autres tables et ressources sur le serveur.
Ali Razeghi

Réponses:

5

Au lieu de s'appuyer sur une base de données relationnelle pour effectuer ces calculs statistiques sur des données de séries chronologiques, je vous suggère de déplacer ce travail mathématique et de post-traitement en dehors de la base de données dans une application cliente.

En utilisant un langage de script comme Python ou Ruby, vous pouvez résoudre le problème de manière incrémentielle en recherchant des «morceaux» de données sur une période de temps fixe, calculer un résumé statistique intermédiaire, puis combiner les résultats sur plusieurs morceaux, pendant que vous bouclez sur toute l'histoire. Certaines mesures statistiques sont difficiles à combiner entre les morceaux, mais quelque chose comme Avg () n'a besoin que de sum () et count () par morceau, O (1) vs O (chunksize), donc la fusion de morceaux peut bien évoluer.

Jpierc
la source
J'ai essayé quelque chose comme ça en utilisant python / pandas . le calcul était plus rapide (quelques secondes) mais la récupération de toutes les données était lente. Peut-être qu'un meilleur chunksizepourrait aider. +1
Andres
1

Étant donné que vos données ne changent pas et qu'elles sont uniquement ajoutées, je stocke les données où vous le souhaitez; Amazon S3 par exemple, mais toute base de données à lecture rapide sera correcte. Pas d'index. La base de données / FS que vous choisissez doit avoir la possibilité de lire les données dans des compartiments: vous pouvez, par exemple, avoir un fichier par jour avec vos enregistrements 1M.

Ensuite, j'utiliserais Spark pour faire le filtrage / l'analyse. Il est basé sur un cluster, vous pouvez l'adapter à vos besoins.

Leo
la source
J'accepte, j'ai déjà mon jeu de données séparé par jour. Je pensais aussi à HDFS et HBase
Andres
0

La réponse dépend de la façon dont vous allez utiliser les données après cela. Si pour le traitement, mieux utiliser Cassandra, si pour l'analyse, mieux utiliser Hive.

Prototypage Artemy
la source
J'ai compris que la ruche ne pouvait pas être le meilleur choix real time. Ai-je tort?
Andres
1
Oui, HBase est pour la lecture / écriture en temps réel. Mais Cassandra peut faire de même aussi. Mais je pense que HBase est meilleur.
Artemy Prototyping
0

Ce type de situation est idéal pour l'entreposage de données, en utilisant les techniques perfectionnées par Ralph Kimball et co., Sur des plates-formes comme SQL Server (celle que je connais le mieux). Ils ont été conçus spécifiquement pour ce type de scénario: d'énormes quantités d'enregistrements de données relativement statiques, pour lesquelles vous devez calculer des agrégats de ce type. NonLa technique relationnelle sera adaptée à l'entreposage de données correctement implémenté dans des applications de ce type, bien que certaines soient certainement meilleures que d'autres si votre organisation ne peut tout simplement pas se permettre les licences des packages logiciels (tels que SQL Server Analysis Services) qui les implémentent. Il existe également une courbe d'apprentissage pour implémenter des langages tels que MDX qui sont conçus sur mesure pour ce type d'accès aux données. Si l'entreposage de données est une option viable pour votre organisation, alors ne perdez pas de temps à chercher une solution relationnelle; ce n'est pas un problème de base de données relationnelle. Je peux poster quelques références de base à Kimball, etc. et des liens vers SSAS et MDX (désolé, je ne peux pas aider Oracle et d'autres concurrents que je ne connais pas) si besoin est. J'espère que ça aide.

SQLServerSteve
la source