2016-11-19 3 views
0

J'ai un serveur cassandra qui est interrogé par un autre service et j'ai besoin de réduire le nombre de requêtes.Extraction du filtre bloom de Cassandra

Mon premier réflexe était de créer un filtre bloom de la base de données toutes les deux minutes et de l'envoyer au service. mais comme j'ai quelques centaines de gigaoctets dans la base de données (qui devrait atteindre quelques téraoctets), il ne semble pas être une bonne idée de surcharger la base de données toutes les quelques minutes. Après un moment de recherche d'une meilleure solution, je me suis souvenu que Cassandra maintient son propre filtre bloom.

Est-il possible de copier les fichiers * -Filter.db et de les utiliser dans mon code au lieu de créer mon propre filtre bloom?

+0

_Queried_ comment? Je ne comprends pas pourquoi vous pensez avoir besoin d'accéder à son filtre bloom. –

+0

J'exécute des requêtes cql du service vers cassandra. Et je veux réduire le nombre de requêtes à Cassandra. Au lieu de créer mon propre filtre bloom, je voudrais utiliser le filtre bloom intégré dans cassandra. –

+0

Pourquoi voudriez-vous faire ce que cassandra fait déjà? Votre système ne sera pas plus rapide si vous pré-filtrez vos requêtes avec le "même" BF. Si vous voulez être plus rapide, vous devez mettre en cache des données (plus que, ou d'une manière différente de ce que Cassandra fait bien sûr). A MON HUMBLE AVIS. – xmas79

Répondre

0

J'ai créé un test de table

CREATE TABLE test (
    a int PRIMARY KEY, 
    b int 
); 

Inséré 1 rangée

INSERT INTO test(a,b) VALUES(1, 10); 

Une fois les données flush sur le disque. nous pouvons utiliser le fichier *-Filter.db. Pour mon cas, il était la-2-big-Filter.db Voici l'exemple de code pour vérifier si une clé de partition existe

Murmur3Partitioner partitioner = new Murmur3Partitioner(); 

try (DataInputStream in = new DataInputStream(new FileInputStream(new File("la-2-big-Filter.db"))); IFilter filter = FilterFactory.deserialize(in, true)) { 
    for (int i = 1; i <= 10; i++) { 
     DecoratedKey decoratedKey = partitioner.decorateKey(Int32Type.instance.decompose(i)); 
     if (filter.isPresent(decoratedKey)) { 
      System.out.println(i + " is present "); 
     } else { 
      System.out.println(i + " is not present "); 
     } 
    } 
} 

Sortie:

1 is present 
2 is not present 
3 is not present 
4 is not present 
5 is not present 
6 is not present 
7 is not present 
8 is not present 
9 is not present 
10 is not present 
+0

Que faire si le BF est toujours en mémoire et n'a pas été conservé sur le disque? – xmas79

+0

Lorsque le contenu d'une memtable dépasse un seuil configurable, les données memtable, qui incluent des index, sont placées dans une file d'attente pour être vidées sur le disque. Vous pouvez configurer la longueur de la file d'attente en changeant le paramètre memtable_heap_space_in_mb ou memtable_offheap_space_in_mb dans le cassandra.yaml, mais je pense que vous ne devriez pas changer le seuil, vous devriez plutôt ajouter une nouvelle valeur ajoutée à votre filtre bloom. –

+0

Ou vous pouvez utiliser le cache –