ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [5장] 엘라스틱서치 집계
    책/엘라스틱_스택_개발부터_운영까지 2022. 3. 23. 08:23

    엘라스틱서치 집계

    • 메트릭 집계, 버킷 집계, 파이프라인 집계
    • 메트릭 집계: 통계나 계산에 사용
    • 버킷 집계: 도큐먼트를 그룹핑 하는데 사용
    • size:0 설정하면 집계에 사용한 도큐먼트를 결과에 포함하지 않아 비용이 절감됨

    메트릭 집계

    • 최소/최대/합계/평군/중간값 같은 통계 결과를 보여줌
    • 메트릭 집계 종류
      • 평균값(avg)
      • 최솟값(min)
      • 최댓값(max)
      • 총합(sum)
      • 백분윗값(percentile)
      • min/max/sum/avg/count(stats)
      • 유니크 갯수(cardinality)
      • 위치 정보 중심점(geo-centroid)
    • 유니크 값 계산
      • precision_threshold는 높을 수록 정확도가 올라가지만 리소스를 많이 사용함
      • 실제 결과보다 크게 설정해야함
      • 기본값은 3000, 최대 40000까지 설정가능
      • 버킷 집계의 일종은 terms 를 사용하면 유니크한 (필드갯수, 필드값)을 확인 가능
    • 쿼리를 이용하여 검색하고 싶은 범위를 먼저 설정하고 집계를 할 수 있다.

    버킷 집계

    • 특정 기준에 맞춰 도큐먼트를 그룹핑 하는 역할
    • 버킷: 도큐먼트가 분할되는 단위로 나뉜 각 그룹
    • 그룹핑을 위해서는 범주형 필드를 이용해야 함
    • 버킷 집계 종류
      • histogram: 일정 간격 분류
      • date_histogram: 일정 날짜/시간 간격 분류
      • range: 사용자 지정 범위 간격 분류
      • date_range: 사용자 지정 날짜/시간 간격 분류
      • terms: 많이 나타나는 용어(값) 기준 분류
      • significant_terms: 인덱스 내 전체 문서 대비 현재 검색 조건에서 유의미한 값을 기준으로 분류
      • filters: 각 그룹에 포함될 조건 직접 지정
    • 용어 집계가 정확하지 않은 이유
      • 분산 시스템의 여러 노드에서 분산하고 취합하는 집계 과정에서 발생할 수 있는 오류 가능성 때문
      • 모든 도큐먼트를 가져와 한 번에 집계하는 것이 아니라 분산되어 있는 개별 노드단에서 집계하고 그 결과를 취합하여 다시 집계하기 때문에 오류 가능성이 있음
    • 정확성 높이기
      • 용어 집계 요청 시, show_term_doc_count_error: true 파라미터를 추가한다.
      • 해당 파라미터를 추가히면, doc_count_error_upper_bound가 나오는데 0이 나오면 오류가 없다는 뜻
      • 이상값이 나올 경우, shard_size 파라미터를 늘릴 필요가 있음. 샤드 크기는 용어 집계 과정에서 개별 샤드에서 집계를 위해 처리하는 갯수를 의미
      • 샤드 크기를 늘린다면 정확도가 올라가나 리소스를 많이 사용함. 기본적으로 size(버킷갯수) * 1.5 + 10으로 계산됨집계 조합
    • 버킷 집계 + 메트릭 집계 조합 => 다양한 그룹별 통계 계산 가능
    • 기본적 형태: 버킷 집계로 도큐먼트 그룹핑 -> 버킷 집계별 메트릭 집계를 사용

    서브 버킷 집계

    • 버킷 안에서 다시 버킷 집계를 요청하는 집계
    • 집계 작업 전에 불필요한 도큐먼트는 제외하고 서브 버킷을 두어 효율적 그룹핑 가능
    • 2단계를 초과해서 만들지 않는 편이 좋음. 성능이 느려질 뿐만 아니라 클러스터에 과도한 부하일 수 있음

    파이프라인 집계

    • 이전 결과를 다음 단계에서 이용하는 파이프라인 개념 차용
    • 이전 결과가 다음 입력값이 됨
    • 부모 집계, 형제 집계
      • 부모 집계: 기존 집계 내부에서 작성
        • derivative(미분), cumulative_sum(누적합)
      • 형제 집계: 기존 집계 외부에서 새로 작성
        • min_bucket, max_bucket, avg_bucket, sum_bucket, stat_bucket, percentile_bucket, moving_avg
    • 버킷 경로(buckets_path)를 반드시 적어야 함부모 집계
    • 단독 사용 불가
    • 반드시 먼저 다른 집계가 있어야 함
    • 이전 집계 내부에서 사용(이전 집계의 결과값이 부모 집계의 입력값이 됨)

    형제 집계

    • 외부에서 기존 집계를 이용해 집계 작업 진행
    • buckets_path에서 > 기호를 사용하여 하위 집계 경로를 나타냄
    • 기존 집계 외부에서 결과를 보여줌

    스터디

    • 집계 실습을 해볼 수 있어 좋았다. 다양한 조건과 항목으로 집계가 가능하다. 관계형 데이터베이스에서 집계 쿼리를 작성해본 적은 없지만, 여러개의 테이블을 사용할 경우 문법상 고려할 부분들이 많을 것 같은데 json 형식으로 api를 통해 집계가 이루어지다 보니 문법이 좀 더 간단하게 느껴졌다. 또한, 속도도 더 빠르게 이루어 질 수 있어 보였다. 
    • 집계와 관련된 이야기를 하면서 R작업은 빠르지만 CUD 작업은 엘라스틱서치에서 부하가 발생하는 작업이다. 따라서 Read 목적으로만 엘라스틱서치를 사용하는 것이 유용해보였다. 실제 데이터는 RDB에 넣어두고 일정 주기로 인덱싱하여 엘라스틱 서치에 넣어주는 방식으로 진행할 수 있다. 
    • 오차 가능성을 고려하여 조정해야할 값들이 있어 오차 가능성이 꽤 있어 보였다. 따라서 정확한 통계나 집계를 해야할 항목보다는 약간의 오차가 있어도 괜찮은 부분들에 있어 집계를 해야 유용할 것 같다는 생각이 들었다. 상품추천이나 검색어 추천 등에 사용하면 유용할 듯 싶었다. 
    • cardinality 집계 사용시 precision_threshold 값이 카디널리티의 실게 결과보다 크게 잡아야하는 이유에 대해 이야기하다가 HiperLogLog 내용까지 약간 보게 되었는데, 정확하게 이해하기는 어려웠지만 precision_threshold와 메모리는 연관이 꽤 있어보였다. 따라서 precision_threshold 값이 크면 메모리 사용량도 높아지고 정확해지지만 성능상 부하가 있을 수 있다. ( 참고링크1(naver D2), 참고링크2(블로그) )

    링크

    댓글

Designed by Tistory.