수동 컴팩션

수동 컴팩션 (Manual compaction)

Apache Druid에서 컴팩션(compaction)은 Druid 데이터소스의 데이터를 읽어 같은 데이터소스에 다시 쓰는 특별한 유형의 ingestion task예요. 수동 컴팩션으로 특정 interval에 대해 일회성 컴팩션 task를 직접 제출하는 방법을 알아봐요.

출처: 문서

본문

Apache Druid에서 컴팩션은 Druid 데이터소스에서 데이터를 읽어 같은 데이터소스에 다시 쓰는 특별한 유형의 ingestion task예요. 자주 쓰이는 사례는 ingestion 후 segment 크기를 최적으로 만들기 위한 컴팩션이에요. 이렇게 하면 쿼리 성능이 좋아져요.

특정 interval에 대해 일회성 컴팩션 task를 제출해서 수동 컴팩션을 수행할 수 있어요. 대부분의 워크로드에 권장되는 자동 컴팩션을 사용한다면 보통은 수동 컴팩션이 필요 없어요.

수동 컴팩션 설정하기

컴팩션 task는 다음 문법에 따라 정의된 interval의 모든 segment를 병합해요:

{
	"type": "compact",
	"id": <task_id>,
	"dataSource": <task_datasource>,
	"ioConfig": <IO config>,
	"dimensionsSpec": <custom dimensionsSpec>,
	"transformSpec": <custom transformSpec>,
	"metricsSpec": <custom metricsSpec>,
	"tuningConfig": <parallel indexing task tuningConfig>,
	"granularitySpec": <compaction task granularitySpec>,
	"context": <task context>
}
Field Description Required
type Task type. 값을 compact로 설정해요. Yes
id Task ID No
dataSource 컴팩션할 데이터소스 이름 Yes
ioConfig 컴팩션 task의 I/O 설정. 자세한 내용은 컴팩션 I/O 설정 섹션을 참고해요. Yes
dimensionsSpec 설정하면 컴팩션 task는 기존 segment에서 자동 생성하지 않고 지정한 dimensionsSpec을 사용해요. No
transformSpec 설정하면 컴팩션 task는 null을 쓰지 않고 지정한 transformSpec을 사용해요. No
metricsSpec 설정하면 컴팩션 task는 기존 segment에서 자동 생성하지 않고 지정한 metricsSpec을 사용해요. No
segmentGranularity Deprecated. granularitySpec을 사용하세요. No
tuningConfig 병렬 indexing을 위한 Tuning configuration이에요. 컴팩션 task에서는 awaitSegmentAvailabilityTimeoutMillis 값을 지원하지 않아요. 이 파라미터는 기본값 0으로 두세요. No
granularitySpec 설정하면 컴팩션 task는 기존 segment에서 자동 생성하지 않고 지정한 granularitySpec을 사용해요. No
context Task context No

info

참고: segmentGranularity 대신 granularitySpec을 사용하세요. 그리고 둘 중 하나만 설정하세요. 같은 컴팩션 spec에 서로 다른 값을 지정하면 task가 실패해요.

시간 청크당 결과 segment 수를 제어하려면 maxRowsPerSegment 또는 numShards를 설정할 수 있어요.

info

여러 컴팩션 task를 병렬로 실행할 수 있어요. 예를 들어 1년치 데이터를 컴팩션하려는 경우, 1년 전체를 처리하는 task 하나를 실행할 필요 없이 1개월 간격의 컴팩션 task 12개를 실행할 수 있어요.

컴팩션 task는 내부적으로 컴팩션 작업을 수행하기 위한 고정 파라미터를 가진 index 또는 index_parallel task spec을 생성해요. 예를 들어 inputSource는 항상 druid input source이고, 기본적으로 dimensionsSpec·metricsSpec에는 입력 segment의 모든 dimension과 metric이 포함돼요.

컴팩션 task는 보통 하위 task를 시작하기 전에 모든 segment를 가져오지만, 다음 속성들이 모두 null이 아닌 값으로 설정된 경우는 예외예요. 성능을 최대화하고 compact task의 디스크 사용을 최소화하려면 다음 값들을 null이 아닌 값으로 설정하는 것을 강력히 권장해요:

  • segmentGranularity·queryGranularity·rollup 각각에 null이 아닌 값을 가진 granularitySpec
  • metricsSpec

컴팩션 task는 다음 두 경우 아무 작업도 하지 않고 종료하면서 실패 상태 코드를 내보내요:

  • 지정한 interval에 로드된 데이터 segment가 없는 경우
  • 지정한 interval이 비어 있는 경우

입력 segment들의 메타데이터가 서로 다르면 입력 segment와 컴팩션 결과 segment의 메타데이터도 다를 수 있어요. 반면 모든 입력 segment의 메타데이터가 같다면 결과 segment도 모든 입력 segment와 같은 메타데이터를 가져요.

수동 컴팩션 task 예시

다음 JSON은 interval 2020-01-01/2021-01-01 내의 모든 segment를 컴팩션하고 새 segment를 만드는 컴팩션 task를 보여줘요:

{
	"type": "compact",
	"dataSource": "wikipedia",
	"ioConfig": {
		"type": "compact",
		"inputSpec": {
			"type": "interval",
			"interval": "2020-01-01/2021-01-01"
		}
	},
	"granularitySpec": {
		"segmentGranularity": "day",
		"queryGranularity": "hour"
	}
}

granularitySpec은 선택 필드예요.

granularitySpec을 지정하지 않으면, Druid는 컴팩션 완료 시 원래의 segment granularity와 query granularity를 유지해요.

컴팩션 I/O 설정

컴팩션 ioConfig는 다음과 같이 inputSpec을 지정해야 해요:

  • true면 task는 interval 타입 inputSpec에서 interval에 완전히 포함된 모든 기존 segment를 교체해요. 컴팩션이 실패하면 Druid는 기존 segment를 변경하지 않아요.
  • true면 task는 제공된 interval이나 granularity에 정렬되지 않은 명시적인 interval을 허용해요. 이 파라미터는 명시적으로 제공된 경우에만 사용돼요.
Field Description Default Required
type Task type. 값을 compact로 설정해요. none Yes
inputSpec 대상 interval 또는 segment 명세 none Yes
dropExisting WARNING: ioConfig의 dropExisting은 beta 기능이에요. false No
allowNonAlignedInterval 하위 호환성을 위해 제공되는 파라미터예요. 대부분의 시나리오에서는 설정하지 말아야 해요. 데이터가 실수로 overshadow될 수 있기 때문이에요. 이 파라미터는 향후 릴리스에서 제거될 수 있어요. false No

컴팩션 task에는 두 종류의 inputSpec이 있어요:

Interval inputSpec

Field Description Required
type Task type. 메이저 컴팩션을 트리거하려면 값을 interval로 설정해요. Yes
interval 컴팩션할 interval Yes

Minor inputSpec

Field Description Required
type Task type. 마이너 컴팩션을 트리거하려면 값을 minor로 설정해요. Yes
interval 컴팩션할 interval Yes
segments segment descriptor 목록 Yes

필요한 segment descriptor 필드는 웹 콘솔의 "Segments" 섹션에서 가져올 수 있어요.

Field Description Required
itvl 컴팩션할 segment의 interval Yes
ver segment의 버전 Yes
part segment의 파티션 번호 Yes

minor inputSpec 예시

{
	"type": "minor",
	"interval": "2020-01-01T00:00:00.000Z/2020-01-01T01:00:00.000Z",
	"segments": [
		{
			"itvl": "2020-01-01T00:00:00.000Z/2020-01-01T01:00:00.000Z",
			"ver": "2020-01-01T00:07:18.186Z",
			"part": 0
		},
		{
			"itvl": "2020-01-01T00:00:00.000Z/2020-01-01T01:00:00.000Z",
			"ver": "2020-01-01T00:07:18.186Z",
			"part": 1
		}
	]
}

minor inputSpec을 사용하면 task는 지정된 segment만 컴팩션해요. 같은 interval에 있지만 spec에 없는 segment는 컴팩션 대신 그 자리에서(in-place) 업그레이드돼요. 이렇게 하면 다른 segment를 보존하면서 일부 segment만 컴팩션할 수 있어요.

마이너 컴팩션을 실행할 때는 몇 가지 요구사항이 있어요:

  • task context에서 useConcurrentLocks: true를 설정해요. 마이너 컴팩션은 전체 interval에 대해 REPLACE lock을 사용해요.
  • ioConfig에서 dropExisting: true를 설정해요.

Segment inputSpec

deprecated라 더 이상 문서화하지 않아요. interval 또는 minor spec을 사용하세요.

컴팩션 dimensions spec

Field Description Required
dimensions dimension 이름 또는 객체 목록이에요. dimensions와 dimensionExclusions 양쪽에 같은 컬럼을 둘 수 없어요. 기본값은 null로 원래 dimension을 유지해요. No
dimensionExclusions 컴팩션에서 제외할 dimension 이름이에요. 여기서는 이름만 지원하고 객체는 지원하지 않아요. 이 목록은 dimensions 목록이 null이거나 비어 있을 때만 사용되고, 그 외에는 무시돼요. 기본값은 []예요. No

컴팩션 transform spec

Field Description Required
filter filter는 컴팩션 중 입력 행을 조건부로 걸러내요. 필터를 통과한 행만 컴팩션된 segment에 포함돼요. Druid의 표준 query filters를 모두 사용할 수 있어요. 기본값은 어떤 행도 걸러내지 않는 'null'이에요. No

컴팩션 granularity spec

Field Description Required
segmentGranularity segment granularity의 시간 청킹 주기예요. 기본값은 'null'로 원래 segment granularity를 유지해요. 모든 Query granularity 값을 받아요. No
queryGranularity 각 segment 내 timestamp 저장 해상도예요. 기본값은 'null'로 원래 query granularity를 유지해요. 모든 Query granularity 값을 받아요. No
rollup 컴팩션 시점 rollup을 활성화해요. 원래 설정을 유지하려면 기본값을 두세요. 컴팩션 시점 rollup을 활성화하려면 값을 true로 설정하세요. 데이터가 rollup되면 더 이상 개별 레코드를 복구할 수 없어요. No

더 알아보기 (Learn more)

자세한 내용은 다음 주제를 참고하세요:

  • Compaction — Druid에서 컴팩션 개요와 수동 컴팩션 설정 방법을 알아봐요.
  • Segment optimization — Druid segment 크기를 평가하고 최적화하는 방법을 살펴봐요.
  • Coordinator process — Coordinator가 컴팩션 task를 계획하는 방법을 자세히 알아봐요.