Indexer 서비스
Indexer 서비스 (Indexer service)
Indexer 서비스는 Middle Manager + Peon task 실행 시스템의 대안이에요. task마다 별도 JVM 프로세스를 fork하는 대신, Indexer는 단일 JVM 프로세스 안에서 task를 별도 스레드로 실행해요.
출처: 문서
본문
info
Indexer는 선택적이고 실험적인 기능이에요. 주로 배치 ingestion을 수행한다면 MiddleManager와 Peon task 실행 시스템이나 Kubernetes를 이용한 MiddleManager-less ingestion을 권장해요. 주로 스트리밍 ingestion을 한다면 Kubernetes를 이용한 MiddleManager-less ingestion이나 Indexer 서비스를 시도해 볼 수 있어요.
Apache Druid Indexer 서비스는 Middle Manager + Peon task 실행 시스템의 대안이에요. task마다 별도 JVM 프로세스를 fork하는 대신, Indexer는 단일 JVM 프로세스 안에서 task를 별도 스레드로 실행해요.
Indexer는 Middle Manager + Peon 시스템보다 설정과 배포가 쉽고, task 간 리소스 공유를 더 잘 지원하도록 설계되었어요.
설정 (Configuration)
Apache Druid Indexer 서비스 설정은 Indexer Configuration을 참고하세요.
HTTP 엔드포인트
Indexer 서비스는 Middle Manager와 동일한 HTTP 엔드포인트를 공유해요.
실행 (Running)
org.apache.druid.cli.Main server indexer
task 리소스 공유
Indexer 서비스 안에서 실행되는 모든 task가 다음 리소스를 공유해요.
쿼리 리소스
쿼리 처리 스레드와 버퍼는 모든 task가 공유해요. Indexer는 모든 task가 공유하는 단일 엔드포인트에서 쿼리를 서비스해요.
query caching이 활성화되면 쿼리 캐시도 모든 task가 공유해요.
서버 HTTP 스레드
Indexer는 동일한 크기의 HTTP 스레드 풀 두 개를 유지해요.
하나의 풀은 Overlord와 Indexer 사이의 task 제어 메시지 전용("chat handler threads")이에요. 다른 풀은 그 외 모든 HTTP 요청을 처리해요.
스레드 수를 구성하려면 druid.server.http.numThreads 속성을 사용하세요. 예를 들어 druid.server.http.numThreads가 10으로 설정되면 chat handler 스레드 10개와 non-chat handler 스레드 10개가 있게 돼요.
이 두 풀 외에도 Indexer는 lookup 처리를 위한 별도 스레드 2개를 할당해요. lookup을 사용하지 않으면 이 스레드는 사용되지 않아요.
메모리 공유
Indexer는 druid.worker.globalIngestionHeapLimitBytes 속성을 사용해 실행 중인 모든 task에 전역 heap 한도를 적용해요.
이 전역 한도는 druid.worker.capacity가 구성한 task 슬롯 수로 균등하게 나뉘어요.
task별 heap 한도를 적용하기 위해 Indexer는 task 튜닝 설정의 maxBytesInMemory를 덮어써요. 즉 기본값이나 사용자가 구성한 값을 무시해요. 또한 maxRowsInMemory를 사실상 무제한 값으로 덮어써요 — Indexer는 행 수 제한(row limits)을 지원하지 않아요.
기본적으로 druid.worker.globalIngestionHeapLimitBytes는 사용 가능한 JVM heap의 1/6로 설정돼요. 이 기본값은 Middle Manager + Peon 시스템을 사용할 때 task 튜닝 config의 maxBytesInMemory 기본값(역시 JVM heap의 1/6)과 맞추기 위해 선택된 거예요.
heap 메모리에 보관되는 행의 최대 사용량은 task 튜닝 config의 maxBytesInMemory와 maxPendingPersists 속성의 상호작용과 관련돼요. task가 heap에 보관하는 행 데이터 양이 maxBytesInMemory가 지정한 한도에 도달하면, task는 heap 내 행 데이터를 persist해요. persist가 시작된 후에는 persist가 실행되는 동안 task가 다시 최대 maxBytesInMemory 바이트의 행 데이터를 ingestion할 수 있어요.
즉, 행 데이터의 최대 in-heap 사용량은 대략 maxBytesInMemory * (2 + maxPendingPersists)까지 될 수 있어요. maxPendingPersists의 기본값은 0이며, 이는 ingestion 작업과 동시에 1개의 persist가 실행될 수 있게 해요.
heap의 나머지 부분은 쿼리 처리, segment persist/merge 연산, 그리고 기타 heap 사용을 위해 예약돼요.
동시 segment persist/merge 한도
최대 메모리 사용량을 줄이는 데 도움이 되도록, Indexer는 실행 중인 모든 task의 동시 segment persist/merge 연산 수에 한도를 적용해요.
기본적으로 동시 persist/merge 연산 수는 (druid.worker.capacity / 2)로 제한되고 내림 계산돼요. 이 한도는 druid.worker.numConcurrentMerges 속성으로 구성할 수 있어요.
현재 제약 사항
- Indexer를 사용할 때는 별도 task 로그가 현재 지원되지 않아요. 모든 task 로그 메시지는 Indexer 서비스 로그에 기록돼요.
- Indexer는 현재 각 task에 동일한 메모리 한도를 적용해요. 이후 릴리스에서는 task별 메모리 한도가 제거되고 전역 한도만 적용될 거예요. 동시 merge 한도도 제거될 거예요.
- 이후 릴리스에서는 task별 메모리 사용량이 동적으로 관리될 예정이에요. Indexer의 향후 개선 사항에 대한 자세한 내용은 https://github.com/apache/druid/issues/7900을 참고하세요.
더 알아보기 (Learn more)
- Middle Manager — Indexer의 대안인 워커 서비스를 알아봐요.
- Indexer Configuration — Indexer 서비스 설정을 자세히 살펴봐요.