Извлечение фильтра цветения кассандры

У меня есть сервер cassandra, который запрашивает другая служба, и мне нужно уменьшить количество запросов.

Моей первой мыслью было создавать фильтр цветения для всей базы данных каждые пару минут и отправлять его в сервис. но поскольку у меня есть пара сотен гигабайт в базе данных (которая, как ожидается, вырастет до пары терабайт), перегрузка базы данных каждые несколько минут не кажется хорошей идеей.

После некоторого времени поиска лучшего решения я вспомнил, что кассандра поддерживает свой собственный фильтр цветения.

Можно ли скопировать файлы * -Filter.db и использовать их в моем коде вместо создания собственного фильтра цветения?


person Daniel N.    schedule 19.11.2016    source источник
comment
Спрошено как? Я не понимаю, почему вы думаете, что вам нужен доступ к его фильтру цветения.   -  person Sotirios Delimanolis    schedule 19.11.2016
comment
Я выполняю cql-запросы от службы к кассандре. И я хочу уменьшить количество запросов к кассандре. Вместо того, чтобы создавать свой собственный фильтр цветения, я хотел бы использовать встроенный фильтр цветения в кассандре.   -  person Daniel N.    schedule 19.11.2016
comment
Почему вы хотите делать то, что уже делает Кассандра? Ваша система не будет работать быстрее, если вы предварительно отфильтруете свои запросы с помощью того же BF. Если вы хотите быть быстрее, вам нужно будет кэшировать данные (больше, чем уже делает Cassandra, или иным образом). ПО МОЕМУ МНЕНИЮ.   -  person xmas79    schedule 20.11.2016


Ответы (1)


Я создал тестовую таблицу

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

Вставлена ​​1 строка

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

После сброса данных на диск. мы можем использовать файл *-Filter.db. В моем случае это было la-2-big-Filter.db Вот пример кода, чтобы проверить, существует ли ключ раздела.

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 ");
        }
    }
}

Вывод :

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 
person Ashraful Islam    schedule 19.11.2016
comment
Что делать, если BF все еще находится в памяти и не сохраняется на диске? - person xmas79; 20.11.2016
comment
Когда содержимое memtable превышает настраиваемый порог, данные memtable, которые включают индексы, помещаются в очередь для сброса на диск. Вы можете настроить длину очереди, изменив параметр memtable_heap_space_in_mb или memtable_offheap_space_in_mb в cassandra.yaml, но я думаю, вам не следует изменять порог, а вам следует добавить новое добавленное значение в свой фильтр цветения. - person Ashraful Islam; 20.11.2016
comment
Или вы можете использовать кеш - person Ashraful Islam; 20.11.2016
comment
Это как раз и есть суть. Если у вас нет файлов, вы ничего не можете сделать. Вам нужно проделать ту же работу, что и C *. Нет абсолютно никаких причин делать это с точки зрения производительности. ПО МОЕМУ МНЕНИЮ. - person xmas79; 21.11.2016