일래스틱서치에서 scroll 에서 가장 중요하고 잊지 않아야 할 요소는 3가지이다. scroll 값, 스크롤 끝에 왔을 때이다.
curl -XGET 'localhost:9200/_search/scroll?scroll=1m' -d '${scroll_value}'
1. scroll 값
scroll 매개변수는 _search 할 때 매개변수로 사용한다. 한번에 빅 데이터를 읽는 것보다 페이지 단위(pagination)으로 읽기 때문에 배치 처리를 쉽게 할 수 있다. 그러나 scroll 을 쓴다는 것은 메모리를 많이 쓴다는 것을 의미하기 때문에 특정 시간에 스크롤을 많이 쓰면 메모리 부족(OOM)을 발생시킬 수 있다.
scroll 매개변수는 얼마나 오래 "search context"를 유지시키느냐를 의미한다.
잘 생각하면 scroll 값은 사실 상 타임아웃을 발생시키게 하는 값으로 쓰이는 의미를 포함하며, 유효한 scroll 값을 임시적으로 가지게 한다는 의미도 포함하며, 일래스틱서치에서 일부 메모리를 차지하겠다는 의미를 가진다. scroll 자원은 타임아웃이 발생 또는 잘 종료될 때까지 모두 일래스틱서치에서 메모리에서 관리한다.
scroll 값이 바뀌지 않는 값이기 때문에 scroll의 유효기간을 얼마나 지속될지에 대한 timeout 값 정도로 생각하면 될 것 같다.
너무 짧은 시간을 주면 scroll 타임아웃이 발생하고 scan/scroll 중간에 exception이 발생하고 종료된다. 따라서 적당한 데이터를 넣어야 할 필요가 있다. 예를 들어 문서에 10m이라고 적혀있다고 해서 그렇게 적으면 안된다. 테스트를 충분히 해서 작성해야 한다.
scroll의 값을 지정할 때, 10m 또는 3h 로 지정할 수 있다. y는 year, M은 month, m은 minute, h는 시간 이다. 자세한 내용은 아래 참조를 참조한다.
2. 스크롤 마지막 이후
스크롤로 데이터를 읽으면 맨 마지막 요소이후에 결과처리를 해야 한다.
9300 포트로 붙는 Java native의 경우 Hits의 개수에 맞게 처리하면 되니까 큰 무리가 없지만,
9200 포트로 붙는 Http REST API의 경우 404 Not Found가 발생한다. 이를 잘 처리하도록 하면 된다.
참조
https://www.elastic.co/guide/en/elasticsearch/guide/current/scan-scroll.html
https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-scroll.html
https://www.elastic.co/guide/en/elasticsearch/reference/current/common-options.html#time-units
'Elasticsearch' 카테고리의 다른 글
[elasticsearch] 아키텍처 설계 (0) | 2015.08.25 |
---|---|
[elasticsearch] 일래스틱서치 프로토콜과 포트 (0) | 2015.08.25 |
[Elasticsearch] 운영시 주의 사항 - Out of Memory 발생 (0) | 2015.08.14 |
Elasticsearch Java HTTP REST client lib - Jest 소개 (0) | 2015.08.12 |
[elasticsearch] 자바 API의 컨벤션(convention) (0) | 2015.08.12 |