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