티스토리 뷰

Elasticsearch는 검색 뿐만 아니라 강력한 Aggregation 기능도 지원한다. 예를 들어, 웹 록와 같이 구조화된 데이터를 indexing 할 경우 Elasticsearch와 Elastic Stack을 사용해 해당 데이터를 빠르게 분석하고 시각화할 수 있다.
Elasticsearch는 몇 ms만에 대규도 데이터 셋을 Aggregation할 수 있기 때문에 경우에 따라서는 Hadoop, Spark, Flink보다도 좋은 대안이 될 수 있다.
실제로 많은 조직에서 Elasticsearch를 검색보다는 Aggregation 목적으로 많이 사용하기도 한다.

Aggregations, Bucket, Matrix

Hadoop이나 Spark를 사용하기 전에 수행해야 하는 작업을 Elasticsearch Aggregation을 통해 처리할 수 있다. Hadoop Cluster를 통해 대용량 데이터 세트를 분석하거나 속도가 더 빠른 Spark를 사용하여도 결과가 즉각적으로 나오지는 않는다.
또한 평균값을 구하거나 히스토그램을 Aggregation하는 등 비교적 간단한 작업을 수행하는 경우 Aggregation을 한데 모을 수 있어 Elasticsearch의 진짜 성능이 나타난다. Aggregation과 Searching Query를 결합해 분석 항목을 줄이고 더 복잡한 데이터 분석을 가능하게 한다.

예를 들어 MovieLens 데이터 내의 모든 평점을 점수에 따라 버킷한다고 가정해보자.

  • Bucket by rating value
curl -XGET 'localhost:9200:/ratings/_search?size=0&pretty' -d '{
    "aggs": {
        "ratings": {
            "terms": {
                "field": "rating"
            }
        }
    }
}'

=> aggs는 집계를 뜻하고, 다음의 단어들을 aggregation하는 ratings라는 aggregation을 생성한다. 이 경우 rating 필드 하나를 사용한다. 이렇게 하면 주어진 평점 값이 포함된 모든 문서를 간추린다.

  • Count only 5-star ratings
    평점이 5점인 평점만 counting하고 싶다고 가정할 경우 이렇게 작성할 수 있다.
curl -XGET 'localhost:ratings/_search?size=0&pretty' -d '{
    "query": {
         "match": {
             "rating": 5.0
         }
    },
    "aggs": {
        "ratings": {
            "terms": {
                "field": "rating"
            }
        }
    }
}'

=> query절을 덧붙이면 쿼리절이 먼저 범위를 평점이 5.0인 결과물로 범위를 좁힌 후에 검색된 결과를 aggregation한다.

  • Average rating for Star Wars
    스타워즈 4에 대한 평점만을 알고싶다면 다음과 같이 작성할 수 있다.
curl -XGET 'localhost:9200/ratings/_search?size=0&pretty' -d '{
    "query": {
        "match_phrase": {
            "title": "Star Wars Episode IV"
        }
    },
    "aggs": {
        "avg_rating": {
            "avg": {
                "field": "rating"
            }
        }
    }
}'

Histogram

Aggregation을 통한 또 하나의 장점은 검색 Index 내 데이터에서 히스토그램을 빠르게 생성할 수 있다는 것이다.
위의 예시를 그대로 가져와서, 평점을 0.5 단위가 아닌 1.0 단위로 끊어서 평점별 영화의 수를 합산한다면 각 점수대의 평점의 영화의 갯수를 가시적으로 확인할 수 있다. 방법은 1.5 평점과 1.0 평점을 함께 묶고, 2.5 평점과 2.0 평점을 묶는 식으로 작성하면 된다.

curl -XGET 'localhost:9200/ratings/_search?size=0&pretty' -d '{
    "aggs": {
        "whole_ratings": {
            "histogram": {
                "field": "rating",
                "interval": 1.0   # histogram 간격 범위
            }
        }
    }
}'

이번에는 Index안에 10년마다 출시된 영화가 몇편이나 있는지 합산한다면 다음과 같이 작성할 수 있다.

curl -XGET 'localhost:9200/Movies/_search?Size=0&pretty' -d '{
    "aggs": {
        "release": {
            "histogram": {
                "field": "year",
                "interval": 10
            }
        }
    }
}'

Elasticsearch가 직접 히스토그램 시각화를 진행하진 않고 이는 Kibana를 통한 작업이다. 이 작업은 쉽고 빠르게 그래프를 그릴 수 있는 데이터를 산출하는 작업이다.

Time Series (시계열 데이터)

Elasticsearch는 시계열 데이터를 어떻게 처리할까? 한가지 짚고 넘어가야 할 점은 Elasticsearch는 시간 개념을 처리할 수 있다는 것이다. Elasticsearch는 달력의 규칙, 윤년 등을 모두 알고 있다. 따라서 연도별 혹은 월별로 Aggregation을 수행하면 알아서 처리한다.
웹사이트 조회수를 시간별로 분석해야하는 요구사항이 있다면 이렇게 작성할 수 있다.

curl -XGET 'localhost:9200/kafka-logs/_search?size=0&pretty' -d '{
    "aggs": {
        "timestamp": {
            "date_histogram": {
                "field": "@timestamp",
                "interval": "hour"
            }
        }
    }
}'

좀 더 복잡한 요청사항에는 query와 결합해서 사용하면 더 좋은 결과를 얻을 수 있다. 만약 내 웹사이트가 Googlebot으로부터 매시간 수신하는 트래픽이 얼마인지 궁금하다면?
로그를 먼저 확인해서 Googlebot이 아닌 항목을 먼저 걸러낸 후 결과물을 시간별로 집계를 하면 된다.

curl -XGET 'localhost:9200/kafka-logs/_search?size=0&pretty' -d '{
    "query": {
        "match": {
            "agent": "Googlebot"
        }
    },
    "aggs": {
        "timestamp": {
            "date_histogram": {
                "field": "@timestamp",
                "interval": "hour"
            }
        }
    }
}'

Nested Aggregations (중첩 집계)

중첩 집계는 데이터를 여러 차원으로 분류할 수 있는 기능이다. 집계한 결과를 대상으로 또 집계를 하는 것이다. 예제로 알아보자.
영화 데이터베이스 내 스타워즈 영화의 평균 평점을 계산할 것이다. 먼저 쿼리를 통해 제목이 Star Wars가 포함된 항목을 모두 선별하고, 스타워즈 타이틀을 집계한 각 버킷 내에서 평균 평점을 계산할 것이다.

curl -XGET 'localhost:9200/ratings/_search?size=0&pretty' -d '{
    "query": {
        "match_phrase": {
            "title": "Star Wars"
        }
    },
    "aggs": {
        "titles": {
            "terms": {
                "field": "title.raw"
            },
            "aggs": {
                "avg_rating": {
                    "avg": {
                        "field": "rating"
                    }
                }
            }
        }
    }
}'

'Data Engineering > Elasticsearch' 카테고리의 다른 글

[Elasticsearch] Operation  (0) 2022.11.28
Elasticsearch와 Kafka  (0) 2022.11.24
Elasticsearch와 Apache Hadoop  (0) 2022.11.24
[Elasticsearch] Logstash를 사용한 Syslog  (0) 2022.11.24
[Elasticsearch] Logstash Input Plugin  (0) 2022.11.24
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함