2016-11-19 8 views
0

私は別のサービスによってクエリされるcassandraサーバを持っており、クエリの量を減らす必要があります。cassandraのブルームフィルタを抽出する

私の最初の考えは、数分おきにデータベース全体のブルームフィルタを作成してサービスに送信することでした。 しかし、私は数百ギガバイトのデータベース(数テラバイトに成長すると予想される)を持っているので、データベースを数分おきにオーバーロードするのは良い考えのようには思えません。

しばらくしてより良い解決策を探していたら、私はcassandraが独自のブルームフィルタを維持していることを思い出しました。

* -Filter.dbファイルをコピーして、自分のブルームフィルタを作成する代わりに、自分のコードで使用することはできますか?

+0

_Queried_を?私はあなたがそのブルームフィルタにアクセスする必要があると思う理由が理解できません。 –

+0

私はサービスからcassandraへのcqlクエリを実行しています。そして、私はcassandraへの問い合わせの量を減らしたいと思います。私自身のブルームフィルタを作成する代わりに、私はcassandraに内蔵のブルームフィルタを使用したいと思います。 –

+0

なぜカッサンドラは既にしていることをしたいのですか? 「同じ」BFを使用してクエリを事前にフィルタリングすると、システムが高速になることはありません。より速くしたい場合は、データをキャッシュする必要があります(キャッサンドラが既に行っていることとは異なる、またはそれとは別の方法で)。私見では。 – xmas79

答えて

0

Iは、テーブルテストディスクへのフラッシュデータの後

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 
+0

BFがまだメモリに残っていて、ディスクに残っていない場合はどうなりますか? – xmas79

+0

memtableの内容が設定可能なしきい値を超えると、インデックスを含むmemtableデータがキューに入れられ、ディスクにフラッシュされます。 cacheandra.yamlのmemtable_heap_space_in_mbまたはmemtable_offheap_space_in_mbの設定を変更することで、キューの長さを設定できますが、しきい値を変更しないでください。新しく追加された値をBloomフィルタに追加する必要があります。 –

+0

またはキャッシュ –

関連する問題