Elastic Search

Ch05. 데이터 집계 - 근사값으로 제공되는 집계 연산

webmaster 2025. 9. 18. 22:18
728x90

일반적으로 사용자들은 모든 연산의 계산 결과가 정확할 것이라고 생각하기 때문에 어떠한 집계 연산이 근삿값을 제공하는지 명확히 알지 못하면 큰 낭패를 볼 수 있다.

집계 연산과 정확도

집계 종류 설명
버킷 집계 특정 기준을 충족하는 문서들을 버킷으로 분류하는 집계
메트릭 집계 버킷에 존재하는 문서들을 이용해 각종 통계 지표를 생성하는 집계
파이프라인 집계 서로 다른 메트릭 집계의 출력을 연결하는 집계 패밀리
행렬 집계 추출한 값을 기반으로 결과를 행렬로 생성하는 집계 패밀리

위 집계 중 실제 수학적인 계산을 수행하는 것은 메트릭 집계뿐이다. 이런 메트릭 집계로 제공되는 집계 연산을 목적에 따라 분류할 수 있다.

1) 일반적인 계산을 위한 집계 연산

집계 연산 설명
평균 집계 - 문서에서 추출한 숫자값의 평균을 계산하는 메트릭 집계
- 키워드: avg
카디널리티 집계 - 문서의 특정 필드에 대한 유니크(distinct)연산을 근삿값으로 계산하는 메트릭 집계
- 성능 문제로 내부적으로 HyperLogLog++ 알고리즘을 이용해 근삿값으로 계산(95%)
- 정확도를 위해 precision_threshould 옵션 제공
- 키워드: cardinality
최댓값 집계 - 문서에서 추출한 숫자값의 최댓값을 계산하는 메트릭 집계
- 키워드: max
최솟값 집계 - 문서에서 추출한 숫자값의 최솟값을 계산하는 메트릭 집계
- 키워드: min
합산 집계 - 문서에서 추출한 숫자값의 합계를 계산하는 메트릭 집계
- 키워드: sum

2) 고차원 계산을 위한 집계 연산

집계 연산 설명
지형 경계 집계 - geo_point 타입의 필드를 기반으로 경곗값을 계산하는 메트릭 집계
- 위도, 경도를 계산해서 데이터 그룹의 top_left 좌표와 buttom_right 좌표를 제공
- 키워드: geo_bounds
지형 중심 집계 - geo_point 타입의 필드를 기반으로 중앙값을 계산하는 메트릭 집계
- 위도, 경도를 계산해서 데이터 그룹의 중앙 좌표를 제공
- 키워드: geo_centrold
백분위 수 집계 - 문서에서 추출한 숫자값의 백분위 수를 계산하는 메트릭 집계
- 성능 문제로 내부적으로 T-Digest 알고리즘을 이용해 근삿값으로 계산
- 버킷의 양이 적을 수록 100%의 정확도를 제공, 커질수록 정확도가 떨어진다
- 키워드: percentiles
백분위 수 랭크 집계 - 백분위 수 랭킹을 계산하는 메트릭 집계
- 백분위 수 집계와 마찬가지로 근삿값으로 계산
- 키워드: percentile_ranks

3) 특수한 목적을 위한 집계 연산

집계 연산 설명
통계 집계 - 문서의 각종 통계 지표를 한번에 계산하는 메트릭 집계
- count, min, max, avg, sum 등 제공
- 키워드: stats
확장 통계 집계 - 문서의 각종 통계 지표를 한번에 계싼하는 확장된 메트릭 집계
- count, min, max, avg, sum 등 제공
- 키워드: extended_stats
탑 히트 집계 - 전체 문서 중 가장 관련성이 높은 문서만을 대상으로 하는 메트릭 집계
- 다양한 기준으로 관련성을 계산할 수 있다.
스크립트 메트릭 집계 - 스크립트만을 이용한 메트릭 집계
추출값 카운트 집계 - 집계되는 결과의 카운트를 설정하는 메트릭 집계

 

이 중 근삿값을 제공하는 집계 연산은 카디널리티 집계, 백분위 수 집계, 백분위 수 랭크 집계이다.

카디널리티 집계는 집계 연산 시 중복 제거를 위해 많이 사용하는 연산으로 대부분의 집계 연산에서 계층 구조로 버킷을 생성하기에 전처리 작업으로 중복 제거가 필수이다. 하지만 카디널리티 집계 특성상 집계 결과가 근삿값으로 제공되기 때문에 주의가 필요하다.

분산 환경에서 집계 연산의 어려움

엘라스틱 서치는 독자적인 Groupping 기술인 Aggregation API를 제공한다. AggregationAPI는 버킷 기반의 집계 기능을 독자적으로 구현했기 때문에 분산되어 저장된 대용량 데이터에 대한 집계 연산을 매우 빠르게 처리할 수 있으며, 데이터가 샤드의 개수만큼 분산되어 있기 때문에 요청이 들어올 떄 각 샤드별 1차 집계 -> 중간 결과 취합해 최종 결과 제공 방식으로 동작한다.(한번의 실행으로 검색, 집계 결과를 가지고 오기 떄문에 성능측면에서 효율적이다.)

 

분산 환경에서 집계 예시

평균 집계

  1. 코디네이터 노드가 AVG 집계 요청을 받음.
  2. 클러스터의 모든 샤드에 AVG 집계 요청을 전송.
  3. 각 샤드는 자신이 가진 데이터로 평균값을 계산.
  4. 코디네이터 노드는 모든 샤드 결과를 받을 때까지 대기.
  5. 받은 샤드 평균값을 모아서(default: 10개) 전체 평균을 계산.
  6. 사용자에게 최종 평균값 반환.

최솟값 집계

  1. 코디네이터 노드가 Min 집계 요청을 받음.
  2. 모든 샤드로 Min 집계 요청 전송.
  3. 각 샤드는 자신 데이터에서 최솟값 계산.
  4. 코디네이터는 모든 샤드 결과를 대기.
  5. 받은 값 중 가장 작은 값만 선택.
  6. 사용자에게 최종 최솟값 반환.

최댓값 집계

  1. 코디네이터 노드가 Max 집계 요청을 받음.
  2. 모든 샤드로 Max 집계 요청 전송.
  3. 각 샤드는 자신 데이터에서 최댓값 계산.
  4. 코디네이터는 모든 샤드 결과를 대기.
  5. 받은 값 중 가장 큰 값만 선택.
  6. 사용자에게 최종 최댓값 반환.

합산 집계

  1. 코디네이터 노드가 sum 집계 요청을 받음.
  2. 모든 샤드로 Sum 요청 전송.
  3. 각 샤드는 자신 데이터에서 합계 계산.
  4. 코디네이터는 모든 샤드 결과를 대기.
  5. 받은 모든 샤드 합계를 더하여 전체 합계 계산.
  6. 사용자에게 최종 합계 반환.

카디널리티 집계

  1. 코디네이터 노드가 Cardinality 집계 요청을 받음.
  2. 모든 샤드로 Cardinality 요청 전송.
  3. 각 샤드는 중복 제거 후 유일값 리스트 생성.
  4. 코디네이터는 모든 샤드 결과를 대기.
  5. 모든 샤드의 리스트를 합치고 다시 중복 제거.
  6. 사용자에게 최종 유일값 개수 반환.

데이터가 10개 샤드에 분산되어 저장될 경우 전체 데이터를 읽어서 계산해야 하는 집계 연산의 특성상 모든 샤드에서 연산이 이뤄져야 하며, 1차적으로 10개의 샤드에서 부분 데이터에 대한 계산이 이뤄진 뒤 결과를 모아 2차로 전체 데이터를 기준으로 한번 더 계산이 이루어진다.

카디널리티 집계는 중복을 제거한 데이터 리스트를 코디네이터 노드로 전송해야 하므로, 중복 제거를 위해 모든 중간 결과 리스트를 하나로 모아야만 최종적인 결과를 만들어 낼 수 있다

 

샤드 간에는 데이터들이 모두 네트워크로 오가기 때문에 네트워크 트래픽도 많이 소모된다. (데이터의 종류나 크기에 따라 중간 결과 데이터의 크기가 천차만별이다), 또 코디네이터 노드는 사용자에게 빠른 결과를 제공하기 위해 중간 계산 결과를 메모리에 올려서 처리하기 때문에 메모리 사용량도 데이터의 크기에 비례해서 늘어난다. 이처럼 최종 결과를 도출하기 위해 일정 크기에 데이터를 전송해야만 하는 엘라스틱 서치의 기본 동작 방식이 치명적인 단점으로 작용한다(카디널리티 집계가 대표적)

 

따라서 시스템을 도입할 때 요구사항에 따라 분산환경, 정확, 실시간성 3가지 요소 중 하나는 포기해야 한다.

엘라스틱 서치는 정확도를 포기하는 방식으로 분산환경에서 복잡한 연산들을 처리하고 있으며, 일부 복잡한 연산들은 내부적으로 근삿값을 이용해 처리하는 알고리즘을 사용한다. -> 대부분의 대용량 데이터 처리가 가능하며, 연산 결과를 빠르게 제공 가능하지만 연산을 결과를 100% 신뢰할 수 없다(카디널리티 연산)

728x90