반응형
본 문서는 elasticsearch의 데이터를 검색하는 _search API의 응용에 해당하는 'scroll 파라미터'에 대해 다루고 있습니다.
이를 위해서 [DB] Elasticsearch 구문 검색(_search API): 원하는 내용을 검색하자 를 읽고 오면 더욱 쉽게 이해할 수 있습니다.
Elasticsearch 구문 검색(_search API): scroll
_search API를 사용하면 인덱스 내의 모든 값을 읽어오는 것이 아닌 하나의 페이지를 결과로 리턴합니다. 따라서 대용량 데이터를 리턴하기 위해서는 _search API를 사용할 때 scroll 매개변수를 활용해야합니다. scroll 매개변수를 활용하면 페이지 단위(pagination)로 계속해서 읽을 수 있습니다. 따라서 이를 활용하면 한번에 빅 데이터를 읽는 것이 아니라 페이지 단위(pagination)로 읽기에 배치 처리를 하기 쉽습니다.
curl -XGET 'localhost:9200/_search/scroll?scroll=1m' -d '${scroll_value}'
Parameter: scroll
- scroll 매개변수는 얼마나 오래 "search context"를 유지하냐를 의미하며, scroll의 유효기간(timeout)입니다.
- 이 scroll 자원은 타임아웃이 발생 또는 종료될 때까지 모두 일래스틱서치에서 메모리에서 관리하여, 일부 메모리를 차지하고 있습니다.
- 너무 짧은 시간을 주면 scroll 타임아웃이 발생하고 scan/scroll 중간에 exception이 발생하고 종료됩니다.
- 하지만 scroll 을 쓴다는 것은 메모리를 많이 쓴다는 것을 의미하기 때문에 메모리 부족(OOM)을 발생시킬 수 있습니다.
- 따라서 적당한 데이터를 넣어야 할 필요가 있습니다.
- scroll의 단위
- y: year, M: month, m: minute, h: hour
- e.g. scroll=1m, scroll=3h ...
- y: year, M: month, m: minute, h: hour
공식문서 예시 (scroll)
scroll를 활용한 데이터 요청 (처음)
POST /twitter/_search?scroll=1m
{
"size": 100,
"query": {
"match" : {
"title" : "elasticsearch"
}
}
}
- 위 요청을 보내면 결과는 _scroll_id값을 포함한 결과를 리턴합니다.
- size 파라미터는 각 배치의 결과의 maximum 수를 지정하도록 하는 것으로, 현재 size가 100으로 설정되어 최대 100건의 쿼리 결과가 나옵니다.
- 받은 scroll_id 값을 아래의 POST /_search/scroll의 scroll_id에 넣어주면, 받지 못한 데이터를 100건 씩 이어서 받을 수 있습니다.
- 각각의 scroll API는 더 이상 리턴되는 데이터가 없을 때까지 다음 결과의 배치를 리턴한다.
scroll를 활용한 데이터 요청 (이후)
POST /_search/scroll
{
"scroll" : "1m",
"scroll_id" : "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAD4WYm9laVYtZndUQlNsdDcwakFMNjU1QQ=="
}
- "scroll" : "1m"의 뜻은 엘라스틱서치에게 search context를 1m를 추가로 유지하라고 말하는 것입니다.
- "scroll_id" : 초기 검색 요청과 이후의 각 스크롤 요청은 각각 _scroll_id를 반환하며, 다음 배치의 결과를 받기 위해 scroll API에 이 값을 넘겨줍니다.
- GET이나 POST가 사용되며, 요청 URL에는 인덱스 이름을 포함하지 않아도 된다.
- scroll_id 값이 원래의 search요청을 나타내 주기 때문이다.
Tip! scroll
- 만약 집계를 요청한다면, 오직 처음 요청 결과만 집계 결과를 포함할 것이다.
- 스크롤 요청에는 정렬 순서가 _doc 일 때 더 빨리 최적화를 하는 최적화 기능이 있다.
- 순서에 관계없이 모든 문서를 반복하려면 가장 효율적인 옵션!
Scroll API 닫기
Scroll API 요청을 하면 "search context"는 문서를 다 읽은 후에도 지정된 시간만큼 살아있다. 이는 엘라스틱서치의 메모리를 잡고 있기 때문에 사용이 완료되면 닫아주는 것이 좋습니다.
현재 오픈되어 있는 'search context' 조회
GET /_nodes/stats/indices/search
clear-scroll API: search context 닫기
# 하나의 scroll_id를 닫을 경우
DELETE /_search/scroll
{
"scroll_id" : "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAD4WYm9laVYtZndUQlNsdDcwakFMNjU1QQ=="
}
# 여러개의 scroll_id를 닫을 경우
DELETE /_search/scroll
{
"scroll_id" : [
"DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAD4WYm9laVYtZndUQlNsdDcwakFMNjU1QQ==",
"DnF1ZXJ5VGhlbkZldGNoBQAAAAAAAAABFmtSWWRRWUJrU2o2ZExpSGJCVmQxYUEAAAAAAAAAAxZrUllkUVlCa1NqNmRMaUhiQlZkMWFBAAAAAAAAAAIWa1JZZFFZQmtTajZkTGlIYkJWZDFhQQAAAAAAAAAFFmtSWWRRWUJrU2o2ZExpSGJCVmQxYUEAAAAAAAAABBZrUllkUVlCa1NqNmRMaUhiQlZkMWFB"
]
}
# 살아있는 모든 context를 닫을 경우
DELETE /_search/scroll/_all
참고
- 순천향대학교 교육자료: http://cs.sch.ac.kr/lecture/BigData/2017/03-ElasticSearch-Introduction.pdf
- [Elastic 가이드북] 4.3 검색 API - _search API: https://esbook.kimjmin.net/04-data/4.4-_search
- [elasticsearch] scroll: https://knight76.tistory.com/entry/elasticsearch-scroll
- [elasticsearch] search request body: www.elastic.co/guide/en/elasticsearch/reference/current/search-request-body.html
- [Elasticsearch] Scroll API 사용하기 (전체 문서 읽어오기): https://soyoung-new-challenge.tistory.com/96
반응형
'Study: DeveloperTools(DevTool) > DevTool: NoSQL(Elastic, Mongo)' 카테고리의 다른 글
[Elastic] Elasticsearch 구문 검색: 기본 Query 정리(Elastic Query DSL) (0) | 2022.08.18 |
---|---|
[Elastic] Elasticsearch 구문 검색: 원하는 데이터를 삭제하자 (0) | 2022.08.03 |
[Elastic] Elasticsearch 구문 검색(_search API): 원하는 내용을 검색하자 (feat. dev tool(Kivana)) (0) | 2022.08.02 |
[Elastic] Elasticsearch 구문 검색: 'SQL Query' to 'Query DSL' (0) | 2022.08.02 |
[Elastic] Elasticsearch 구문 검색(_bulk API): 여러 명령을 배치로 수행하자 (0) | 2022.07.27 |