티스토리 뷰
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
- kafka
- DP
- DFS
- Flutter
- 빅데이터를지탱하는기술
- elasticsaerch
- Hadoop
- GROK
- 이코테
- logstash
- Algorithm
- 파이썬
- Elasticsearch
- CS
- OS
- sqoop
- kubernetes
- BOJ
- CSAPP
- mahout
- 네트워크
- cka
- 빅데이터
- heapq
- 백준
- 프로그래머스
- HDFS
- oozie
- Espher
- Python
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |