수집 트러블슈팅 FAQ

수집 트러블슈팅 FAQ

이 문서는 Druid 데이터 수집 중 겪는 흔한 문제와 그 해결 방법을 자주 묻는 질문 형태로 정리한 것이에요.

출처: 문서

본문

배치 수집 (Batch Ingestion)

과거 데이터를 배치로 로드하려는데 이벤트가 하나도 로드되지 않는다면, 수집 스펙의 interval이 실제로 데이터의 interval을 감싸고 있는지 확인하세요. 이 interval 밖의 이벤트는 버려집니다.

Druid가 이벤트를 수집했는데 쿼리 결과에 없어요

수집된 이벤트 수가 정확해 보인다면, 쿼리가 올바르게 작성됐는지 확인해 보세요. 수집 스펙에 count 애그리게이터를 포함했다면, 이 집계 결과를 longSum 애그리게이터로 쿼리해야 합니다. count 애그리게이터로 쿼리를 하면 롤업을 포함한 Druid 행(row) 수를 세게 됩니다.

수집 후 Druid 세그먼트는 어디에 저장되나요?

druid.storage.type이 무엇으로 설정됐느냐에 따라 Druid는 세그먼트를 어떤 딥 스토리지(Deep Storage)에 업로드해요. 기본 딥 스토리지는 로컬 디스크입니다.

스트림 수집이 세그먼트를 hand-off 하지 않아요

먼저 수집 프로세스 로그에 예외가 없는지 확인하세요. 분산 클러스터를 운영한다면 druid.storage.type이 local이 아닌 딥 스토리지로 설정되어 있는지도 확인해 주세요.

hand-off가 실패하는 다른 흔한 이유는 다음과 같아요.

  • Druid가 메타데이터 스토리지에 쓸 수 없음 — 설정이 올바른지 확인하세요.
  • Historical 프로세스의 용량이 가득 차서 더 이상 세그먼트를 다운로드하지 못함 — 이 경우 Coordinator 로그에 예외가 보이고, 웹 콘솔에서 Historical이 용량에 가깝다고 표시됩니다.
  • 세그먼트가 손상돼서 다운로드할 수 없음 — 이 경우 Historical 프로세스에서 예외가 보입니다.
  • 딥 스토리지가 잘못 구성됨 — 세그먼트가 실제로 딥 스토리지에 존재하는지, Coordinator 로그에 오류가 없는지 확인하세요.

배치 수집 태스크를 제출한 뒤 언제 Druid에 쿼리할 수 있나요?

최근 수집 태스크가 만든 세그먼트가 Historical에 로드되어 쿼리 가능한지, 다음 워크플로로 확인할 수 있어요.

  • 수집 태스크를 제출하세요.
  • 태스크가 성공적으로 완료되었다고 표시될 때까지 Overlord의 tasks API(/druid/indexer/v1/task/{taskId}/status)를 반복해서 폴링하세요.
  • Segment Loading by Datasource API(/druid/coordinator/v1/datasources/{dataSourceName}/loadstatus)를 forceMetadataRefresh=true와 interval=<INTERVAL_OF_INGESTED_DATA>로 한 번 호출하세요. (참고로 forceMetadataRefresh=true는 모든 datasource의 Coordinator 메타데이터 캐시를 새로고침하는데, 이는 메타데이터 스토어에 부하를 주는 무거운 작업일 수 있지만 모든 최신 세그먼트의 로드 상태를 검증하려면 필요해요.) 아직 로드되지 않은 세그먼트가 있으면 4단계로 진행하고, 없으면 이제 데이터를 쿼리할 수 있습니다.
  • Segment Loading by Datasource API(/druid/coordinator/v1/datasources/{dataSourceName}/loadstatus)를 forceMetadataRefresh=false와 interval=<INTERVAL_OF_INGESTED_DATA>로 반복 폴링하세요. 모든 세그먼트가 로드될 때까지 폴링을 계속하고, 다 로드된 뒤에는 데이터를 쿼리할 수 있어요. 참고로 이 워크플로는 Segment Loading by Datasource API 호출 시점에 세그먼트가 사용 가능함만 보장합니다. 이후 Historical 프로세스 실패나 다른 이유로 세그먼트가 사라질 수도 있습니다.

Historical 프로세스에 내 Druid 세그먼트가 보이지 않아요

웹 콘솔에서 세그먼트가 실제로 Historical 프로세스에 로드됐는지 확인할 수 있어요. 세그먼트가 없다면 Coordinator 로그에서 용량이나 복제(replication) 오류 메시지를 확인해 보세요. 세그먼트가 다운로드되지 않는 한 가지 이유는 Historical 프로세스의 maxSize가 너무 작아 더 많은 데이터를 다운로드하지 못하는 경우입니다. 예를 들어 다음과 같이 변경할 수 있어요.

-Ddruid.segmentCache.locations=[{"path":"/tmp/druid/storageLocation","maxSize":"500000000000"}]

쿼리가 빈 결과를 반환해요

datasource에 대해 만들어진 dimension과 metric을 세그먼트 메타데이터 쿼리로 확인할 수 있어요. 쿼리에서 사용하는 애그리게이터 이름이 이 metric 중 하나와 일치하는지 확인하세요. 또 지정한 쿼리 interval이 데이터가 존재하는 유효한 시간 범위와 맞는지도 확인해 주세요.

실시간 수집이 멈춘 것 같아요

여러 가지 원인이 있을 수 있어요. 중간 persist가 너무 오래 걸리거나 hand-off가 너무 오래 걸리면, Druid는 메모리 부족 문제를 막기 위해 수집을 조절(throttle)합니다. 프로세스 로그에서 특정 컬럼을 만드는 데 아주 오래 걸린다면(예: 세그먼트 granularity가 hourly인데 단일 컬럼을 만드는 데 30분이 걸린다면), 구성을 재평가하거나 실시간 수집을 스케일업하세요.

더 알아보기 (Learn more)