2016-12-05 4 views
1

J'utilise Apache Cassandra pour stocker principalement des données de séries temporelles. Et je regroupe les données et les regroupe/compte en fonction de certaines conditions. En ce moment je le fais dans une application Java 8, mais avec la sortie de Cassandra 3.0 et les fonctions définies par l'utilisateur, je me suis demandé si extraire la logique de regroupement et d'agrégation/comptage à Cassandra est une bonne idée. À ma connaissance, cette fonctionnalité est quelque chose comme les procédures stockées dans SQL.Avantages et inconvénients des fonctions définies par l'utilisateur de Cassandra

Ma préoccupation est de savoir si cela aura un impact sur les performances de calcul et la performance globale de la base de données. Je ne suis pas sûr qu'il y ait d'autres problèmes et si cette nouvelle fonctionnalité est quelque chose comme les index secondaires dans Cassandra - vous pouvez les faire, mais ce n'est pas recommandé du tout.

Avez-vous utilisé des fonctions définies par l'utilisateur dans Cassandra? Avez-vous des observations sur la performance? Quels sont les bons et les mauvais côtés de cette nouvelle fonctionnalité? Est-ce applicable dans mon cas d'utilisation?

Répondre

4

Vous pouvez le comparer à count() ou avg() types d'agrégations. Ils peuvent vous faire économiser beaucoup de trafic réseau et de création d'objets/GC en faisant en sorte que le coordinateur envoie uniquement le résultat, mais il est facile de se laisser emporter et de faire beaucoup de travail pour le coordinateur. Ce travail supplémentaire élimine les tâches C * normales et peut tout aussi bien augmenter les GC que les réduire. Si votre agrégeant 100 lignes dans une partition est probablement très bien et si votre agrégation 10000 n'est probablement pas la fin du monde si c'est très rare. Si vous l'appelez une fois par seconde, c'est un problème. Si vous agrégez plus de 1000, je serais très prudent.

Si vous avez absolument besoin de le faire et de beaucoup de données souvent, vous pouvez créer des coordinateurs de proxy dédiés (-Djoin_ring = false) pour supporter le poids de la charge sans affecter les lectures/écritures C * normales. À ce stade, il est tout aussi facile de créer une charge de travail dédiée DC pour cela ou quelque chose (avec RF = 0 pour votre espace de clés, et l'application de faire partie de ce DC avec DCAwareRoundRobinPolicy). C'est aussi le point où l'utilisation de Spark est probablement la bonne chose à faire.