블룸 필터
블룸 필터 (Bloom Filter)
Apache Pinot용 블룸 필터 구성에 대해 설명해요.
출처: 문서
본문
컬럼이 이 필터를 사용하도록 구성되면 Pinot는 세그먼트당 하나의 블룸 필터를 만들어요. 블룸 필터는 EQUALITY 또는 IN 조건자와 일치하는 레코드를 포함하지 않는 세그먼트를 프루닝하는 데 도움을 줘요.
참고: IN 절 지원은 조건자의 값이 <= 10개로 제한돼요. 이는 프루닝 오버헤드를 최소화하기 위해서예요.
테이블의 playerID 컬럼에 블룸 필터가 정의된 아래와 같은 쿼리 패턴에 유용해요.
SELECT COUNT(*)
FROM baseballStats
WHERE playerID = 12345
OR
SELECT COUNT(*)
FROM baseballStats
WHERE playerID IN(12345, 45668, 56789)
상세 내용 (Details)
블룸 필터는 요소가 데이터셋에 **없지 않음(is not)**을 결정적으로 판별하는 데 사용되는 확률적 데이터 구조이지만, 요소가 데이터셋에 **있음(is)**을 판별하는 데는 사용할 수 없어요. 블룸 필터는 거짓 양성(false positives)을 만들 수 있지만 거짓 음성(false negatives)은 결코 만들지 않기 때문이에요.
이 필터의 흥미로운 측면은 크기, 인덱싱하는 데이터셋의 카디널리티, 거짓 양성 비율 사이의 관계를 확립하는 수학 공식이 존재한다는 것이에요.
Pinot에서 이 카디널리티는 각 세그먼트 내에서 예상되는 고유 값 수에 해당해요. 필요하면 거짓 양성 비율과 인덱스 크기를 구성할 수 있어요.
지원 컬럼 유형
블룸 필터는 BOOLEAN과 MAP을 제외한 모든 데이터 유형에서 지원돼요: INT, LONG, FLOAT, DOUBLE, BIG_DECIMAL, STRING, BYTES, UUID, JSON, TIMESTAMP.
쿼리 예시
블룸 필터는 투명하게 동작해요 — 특별한 쿼리 문법이 필요 없어요. Pinot는 일치하는 값을 포함할 수 없는 세그먼트를 프루닝하기 위해 블룸 필터를 자동으로 사용해요.
등식 필터:
SELECT playerName, teamID, hits
FROM baseballStats
WHERE playerID = 'bondsba01'
IN 필터(최대 10개 값):
SELECT playerName, yearID, homeRuns
FROM baseballStats
WHERE playerID IN ('bondsba01', 'ruthba01', 'aaronha01')
블룸 필터는 EQUALITY와 IN 조건자에만 도움이 돼요. 범위 쿼리, LIKE, 또는 다른 필터 유형을 가속화하지 않아요.
구성 (Configuration)
블룸 필터는 기본적으로 비활성화되어 있어요. 즉 컬럼은 table configuration에서 명시적으로 구성되지 않으면 인덱싱되지 않아요.
블룸 필터를 구성하는 선택적 파라미터는 3개예요.
| Parameter | Default | Description |
|---|---|---|
| fpp | 0.05 | 블룸 필터의 거짓 양성 확률(0부터 1까지). |
| maxSizeInBytes | 0 (unlimited) | 블룸 필터의 최대 크기. |
| loadOnHeap | false | 블룸 필터를 힙 메모리로 로드할지 off-heap 메모리로 로드할지. |
fpp(거짓 양성 확률)가 낮을수록 블룸 필터의 정확도는 높아지지만 fpp의 감소는 인덱스 크기 증가로 이어져요. maxSizeInBytes가 fpp보다 우선한다는 점을 유의하세요. maxSizeInBytes가 0보다 큰 값으로 설정되고 지정된 fpp를 기반으로 계산된 블룸 필터 크기가 이 크기 제한을 초과하면, Pinot는 블룸 필터 크기가 지정된 한도 내에 유지되도록 fpp를 조정해요.
다른 인덱스와 마찬가지로 블룸 필터는 특수 파라미터 disabled를 true로 설정해 명시적으로 비활성화할 수 있어요.
예시
예를 들어 다음 테이블 구성은 기본값을 사용해 playerId 컬럼에서 블룸 필터를 활성화해요.
{
"tableName": "somePinotTable",
"fieldConfigList": [
{
"name": "playerID",
"encodingType": "RAW",
"indexes": {
"bloom": {}
}
},
...
],
...
}
일부 파라미터를 사용자 지정해야 한다면 fieldConfigList.indexes.bloom에 포함할 수 있어요. 예시가 모든 파라미터를 사용자 지정하더라도 필요한 것만 수정하면 된다는 점을 기억하세요.
{
"tableName": "somePinotTable",
"fieldConfigList": [
{
"name": "playerID",
"encodingType": "RAW",
"indexes": {
"bloom": {
"fpp": 0.01,
"maxSizeInBytes": 1000000,
"loadOnHeap": true
}
}
},
...
],
...
}
이전 구성
기본 설정 사용
기본값을 사용하려면 tableIndexConfig.bloomFilterColumns에 컬럼 이름을 포함하세요.
예를 들어:
{
"tableName": "somePinotTable",
"tableIndexConfig": {
"bloomFilterColumns": [
"playerID",
...
],
...
},
...
}
사용자 지정 파라미터
사용자 지정 파라미터를 지정하려면 tableIndexConfig.bloomFilterConfig 객체에 새 항목을 추가하세요. 키는 컬럼 이름이어야 하고 값은 fieldConfigList의 Bloom 섹션에서 사용할 수 있는 것과 유사한 객체여야 해요.
예를 들어:
{
"tableIndexConfig": {
"bloomFilterConfigs": {
"playerID": {
"fpp": 0.01,
"maxSizeInBytes": 1000000,
"loadOnHeap": true
},
...
},
...
},
...
}