일래스틱서치에서 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

Posted by '김용환'
,