Java 提取卡桑德拉&x27;布卢姆过滤器

Java 提取卡桑德拉&x27;布卢姆过滤器,java,cassandra,bloom-filter,Java,Cassandra,Bloom Filter,我有一个cassandra服务器,它被另一个服务查询,我需要减少查询量 我的第一个想法是每隔几分钟为整个数据库创建一个bloom过滤器,并将其发送到服务。 但是,由于我的数据库中有数百GB(预计将增长到几TB),每隔几分钟重载数据库似乎不是一个好主意 在寻找了一段时间更好的解决方案后,我想起卡桑德拉有自己的布鲁姆过滤器 是否可以复制*-Filter.db文件并在我的代码中使用它们,而不是创建我自己的bloom筛选器?我创建了一个表测试 CREATE TABLE test ( a int P

我有一个cassandra服务器,它被另一个服务查询,我需要减少查询量

我的第一个想法是每隔几分钟为整个数据库创建一个bloom过滤器,并将其发送到服务。 但是,由于我的数据库中有数百GB(预计将增长到几TB),每隔几分钟重载数据库似乎不是一个好主意

在寻找了一段时间更好的解决方案后,我想起卡桑德拉有自己的布鲁姆过滤器


是否可以复制*-Filter.db文件并在我的代码中使用它们,而不是创建我自己的bloom筛选器?

我创建了一个表测试

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

我已经创建了一个表测试

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

怎么问?我不明白你为什么认为你需要访问它的bloom过滤器。我正在运行从服务到cassandra的cql查询。我想减少对cassandra的查询量。我不想创建自己的bloom过滤器,而是想使用cassandra中内置的bloom过滤器。为什么你想做cassandra已经做过的事情?如果您使用“相同”BF预筛选查询,您的系统不会更快。如果您想更快,您需要缓存数据(当然,缓存的数据要比cassandra缓存的数据多,或者以一种不同的方式缓存数据)。伊姆霍,怎么了?我不明白你为什么认为你需要访问它的bloom过滤器。我正在运行从服务到cassandra的cql查询。我想减少对cassandra的查询量。我不想创建自己的bloom过滤器,而是想使用cassandra中内置的bloom过滤器。为什么你想做cassandra已经做过的事情?如果您使用“相同”BF预筛选查询,您的系统不会更快。如果您想更快,您需要缓存数据(当然,缓存的数据要比cassandra缓存的数据多,或者以一种不同的方式缓存数据)。IMHO。如果BF仍在内存中,并且未在磁盘上持久化,该怎么办?当memtable内容超过可配置的阈值时,memtable数据(包括索引)将放入队列中以刷新到磁盘。您可以通过在cassandra.yaml中更改memtable_heap_space_in_mb或memtable_offheap_space_in_mb设置来配置队列的长度,但我认为您不应该更改阈值,而应该向bloom筛选器添加新添加的值。或者您可以使用Cache这正是重点。如果你没有这些文件,你就什么都做不了。你需要做C*已经做过的同样的工作。绝对没有理由在性能方面这样做。IMHO。如果BF仍在内存中,并且未在磁盘上持久化,该怎么办?当memtable内容超过可配置的阈值时,memtable数据(包括索引)将放入队列中以刷新到磁盘。您可以通过在cassandra.yaml中更改memtable_heap_space_in_mb或memtable_offheap_space_in_mb设置来配置队列的长度,但我认为您不应该更改阈值,而应该向bloom筛选器添加新添加的值。或者您可以使用Cache这正是重点。如果你没有这些文件,你就什么都做不了。你需要做C*已经做过的同样的工作。绝对没有理由在性能方面这样做。依我拙见