2016-11-19 8 views
0

나는 다른 서비스에 의해 질의되는 cassandra 서버를 가지고 있으며 질의 양을 줄여야합니다.cassandra의 블룸 필터 추출하기

제 생각에는 처음 몇 분마다 전체 데이터베이스의 블룸 필터를 만들어 서비스에 보냈습니다. 하지만 몇 백 테라 바이트로 증가 할 것으로 예상되는 데이터베이스에 수 백 기가 바이트가 있기 때문에 몇 분마다 데이터베이스에 과부하가 걸리지 않는 것처럼 보입니다.

더 나은 솔루션을 찾으면서 얼마 지나지 않아 캐산드라가 자체 블룸 필터를 유지하고 있음을 기억했습니다.

* -Filter.db 파일을 복사하여 내 블룸 필터를 만드는 대신 코드에서 사용할 수 있습니까?

+0

방법 _Queried_? 블룸 필터에 액세스해야한다고 생각하는 이유를 이해하지 못합니다. –

+0

서비스에서 cassandra로 cql 쿼리를 실행하고 있습니다. 그리고 저는 카산드라에게 질의 양을 줄이고 싶습니다. 내 자신의 블룸 필터를 만드는 대신, 카산드라에 내장 된 블룸 필터를 사용하고 싶습니다. –

+0

왜 카산드라가 이미하는 일을하고 싶습니까? "동일한"BF로 쿼리를 사전 필터링하면 시스템이 더 빨리 작동하지 않습니다. 더 빨라지기를 원하면 데이터를 캐싱해야합니다 (캐산드라가 이미하는 것과 다른 방식으로). IMHO. – xmas79

답변

0

나는 디스크에 데이터를 플러시 후 테이블 테스트

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

삽입 한 행

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 데이터가 디스크로 플러시 될 대기열에 저장됩니다. cassandra.yaml의 memtable_heap_space_in_mb 또는 memtable_offheap_space_in_mb 설정을 변경하여 대기열의 길이를 구성 할 수 있지만 임계 값을 변경하지 말고 새로 추가 된 값을 블룸 필터에 추가해야한다고 생각합니다. –

+0

또는 캐시 –