세그먼트 컴팩션하기
세그먼트 컴팩션하기 (Compact segments)
Apache Druid에서 기존 세그먼트(segment)를 더 적지만 더 큰 세그먼트로 컴팩션(compact)하는 방법을 보여 드릴게요. 쿼리 처리 중에는 세그먼트당 메모리와 처리 오버헤드가 있기 때문에, 전체 세그먼트 수를 줄이는 것이 유리할 수 있어요.
출처: 문서
본문
세그먼트 수를 줄이는 게 왜 좋은지 자세한 내용은 세그먼트 크기 최적화 (Segment size optimization)에서 확인할 수 있어요.
사전 준비 (Prerequisites)
이 튜토리얼은 단일 머신 퀵스타트 (single-machine quickstart)에 설명된 대로 Apache Druid를 이미 다운로드하고 로컬 머신에서 실행 중이라고 가정해요.
아직 하지 않으셨다면, 먼저 다음 튜토리얼을 완료해 주세요:
초기 데이터 로드하기 (Load the initial data)
이 튜토리얼은 Druid 배포판에 포함된 Wikipedia 편집 샘플 데이터를 사용해요. 초기 데이터를 로드하기 위해 세그먼트 granularity가 HOUR 인 배치 데이터를 로드하고, 시간당 1~3개의 세그먼트를 만드는 수집 스펙을 사용해요.
수집 스펙은 quickstart/tutorial/compaction-init-index.json 에서 확인할 수 있어요. compaction-tutorial 이라는 데이터소스를 만들기 위해 다음과 같이 스펙을 제출해 주세요:
bin/post-index-task --file quickstart/tutorial/compaction-init-index.json --url http://localhost:8081
튜토리얼 수집 스펙의 maxRowsPerSegment 는 데모 목적으로 시간당 여러 세그먼트를 만들 수 있도록 1000 으로 설정되어 있어요. 이 스펙을 운영(production) 환경에서는 사용하지 마세요.
수집이 완료된 후 브라우저에서 http://localhost:8888/unified-console.html#datasources 로 이동해 웹 콘솔에서 새 데이터소스를 확인해 보세요.
compaction-tutorial 데이터소스의 Availability 컬럼에서 51 segments 링크를 클릭하면 데이터소스의 세그먼트 정보를 볼 수 있어요.
데이터소스는 입력 데이터에서 시간당 1~3개씩 총 51개의 세그먼트로 구성돼요.
데이터소스에 COUNT 쿼리를 실행해 39,244개의 행이 있는지 확인해 보세요:
dsql> select count(*) from "compaction-tutorial";
┌────────┐
│ EXPR$0 │
├────────┤
│ 39244 │
└────────┘
Retrieved 1 row in 1.38s.
데이터 컴팩션하기 (Compact the data)
이제 이 51개의 작은 세그먼트를 컴팩션하고 세그먼트 granularity를 HOUR 로 유지해 볼게요. Druid 배포판에는 이 튜토리얼 데이터소스를 위한 컴팩션 태스크 스펙이 quickstart/tutorial/compaction-keep-granularity.json 에 들어 있어요:
{
"type": "compact",
"dataSource": "compaction-tutorial",
"interval": "2015-09-12/2015-09-13",
"tuningConfig" : {
"type" : "index_parallel",
"partitionsSpec": {
"type": "dynamic"
},
"maxRowsInMemory" : 25000
}
}
이 스펙은 compaction-tutorial 데이터소스에서 2015-09-12/2015-09-13 구간의 모든 세그먼트를 컴팩션해요.
tuningConfig 의 파라미터는 컴팩션된 각 세그먼트에 존재하는 최대 행 수를 조절해서 컴팩션 결과 세그먼트 집합의 수에 영향을 줘요.
이 데이터소스에는 39,244개의 행만 있어요. 39,244는 동적 파티셔닝 (dynamic partitioning)의 기본 maxRowsPerSegment 한도인 5,000,000보다 작아요. 따라서 Druid는 시간당 컴팩션된 세그먼트를 하나만 만들어요.
지금 컴팩션 태스크를 제출해 주세요:
bin/post-index-task --file quickstart/tutorial/compaction-keep-granularity.json --url http://localhost:8081
태스크가 끝나면 segments 뷰를 새로고침해 주세요.
시간이 지나면서 Coordinator가 원래 51개 세그먼트를 사용하지 않음(unused)으로 표시하고 이후 제거해서 새로 컴팩션된 세그먼트만 남겨요.
기본적으로 Coordinator는 최소 15분 동안 실행된 뒤에야 세그먼트를 사용하지 않음으로 표시해요. 그동안에는 이전 세그먼트 집합과 새 컴팩션 집합이 합쳐진 총 75개의 세그먼트가 보일 수 있어요.
새 컴팩션 세그먼트는 원래 세그먼트보다 더 최신 버전을 가져요. 웹 콘솔이 두 세그먼트 집합을 모두 표시하더라도, 쿼리는 새 컴팩션 세그먼트에서만 읽어요.
compaction-tutorial 에 COUNT 쿼리를 다시 실행해서 행 수가 여전히 39,244인지 확인해 주세요:
dsql> select count(*) from "compaction-tutorial";
┌────────┐
│ EXPR$0 │
├────────┤
│ 39244 │
└────────┘
Retrieved 1 row in 1.30s.
Coordinator가 최소 15분 실행된 뒤에는 세그먼트 뷰에 시간당 하나씩인 새 24개 세그먼트만 표시돼요.
새 세그먼트 granularity로 컴팩션하기 (Compact the data with new segment granularity)
컴팩션 태스크에서 세그먼트 granularity를 변경해서 입력 세그먼트와 다른 granularity를 가진 컴팩션 세그먼트를 만들 수도 있어요.
Druid 배포판에는 DAY granularity 세그먼트를 만드는 컴팩션 태스크 스펙이 quickstart/tutorial/compaction-day-granularity.json 에 들어 있어요:
{
"type": "compact",
"dataSource": "compaction-tutorial",
"interval": "2015-09-12/2015-09-13",
"tuningConfig" : {
"type" : "index_parallel",
"partitionsSpec": {
"type": "dynamic"
},
"maxRowsInMemory" : 25000,
"forceExtendableShardSpecs" : true
},
"granularitySpec" : {
"segmentGranularity" : "DAY",
"queryGranularity" : "none"
}
}
이 컴팩션 태스크 스펙에서는 segmentGranularity 이 DAY 로 설정되어 있는 점에 주목해 주세요.
이제 이 태스크를 제출해 주세요:
bin/post-index-task --file quickstart/tutorial/compaction-day-granularity.json --url http://localhost:8081
Coordinator가 이전 입력 세그먼트를 사용하지 않음으로 표시할 때까지 시간이 걸리므로, 총 25개 세그먼트의 중간 상태를 볼 수 있어요. 결국엔 DAY granularity 세그먼트 하나만 남게 돼요.
더 알아보기 (Learn more)
이 튜토리얼은 컴팩션 태스크 스펙으로 세그먼트를 수동으로 컴팩션하는 방법과, 선택적으로 세그먼트의 세그먼트 granularity를 변경하는 방법을 보여 줬어요.
- 더 자세한 내용은 Compaction을 참고해 주세요.
- 컴팩션의 이점을 알아보려면 세그먼트 최적화 (Segment optimization)를 참고해 주세요.