본문으로 건너뛰기
최종 수정: 에

데이터 압축

Doris는 분석 워크로드에 특히 적합한 컬럼형 스토리지 모델로 데이터를 구성하고 저장합니다. 같은 컬럼의 데이터는 대체로 분포 특성이 비슷하므로 컬럼형 스토리지는 압축에 유리합니다. Doris는 여러 압축 알고리즘을 기본으로 제공하며, 테이블을 생성할 때 워크로드에 가장 적합한 알고리즘을 선택하여 스토리지 비용과 쿼리 성능 사이의 균형을 맞출 수 있습니다.

빠른 선택 가이드​

워크로드마다 압축 요구 사항이 다릅니다. 다음 표는 일반적인 시나리오별 권장 알고리즘을 정리한 것입니다.

사용 시나리오권장 알고리즘이유
고성능 실시간 분석, 동시성이 높은 쿼리LZ4, Snappy압축 해제 속도가 매우 빠르고 CPU 오버헤드가 낮음
스토리지 비용과 쿼리 성능의 균형ZSTD, LZ4F높은 압축률과 빠른 압축 해제 속도를 함께 제공
스토리지 효율이 최우선이며 쿼리 지연 시간에 민감하지 않은 경우ZSTD, Zlib가장 높은 압축률로 디스크 공간 절약
아카이빙 및 콜드 데이터 저장Zlib, LZ4HC압축률을 극대화하여 접근 빈도가 낮은 데이터에 적합

기본 권장 알고리즘은 ZSTD입니다. 대부분의 시나리오에서 우수한 압축률과 빠른 압축 해제 속도를 함께 제공합니다.

압축이 필요한 이유​

Doris에서 데이터 압축의 주요 목적은 다음 두 가지입니다.

  1. 스토리지 비용 절감: 데이터 저장에 필요한 디스크 공간을 줄여 동일한 물리적 리소스에 더 많은 데이터를 저장할 수 있습니다.
  2. 쿼리 성능 향상: 압축된 데이터는 공간을 덜 차지하므로 쿼리 실행 시 I/O 작업이 줄어듭니다. 최신 압축 알고리즘은 압축 해제 속도가 매우 빠르므로 스토리지를 절약하면서 쿼리 응답 속도도 높일 수 있습니다.

지원하는 압축 알고리즘​

Doris는 다음 압축 알고리즘을 지원합니다. 각 알고리즘은 압축률과 압축 해제 속도 사이에서 서로 다른 특성을 보입니다.

압축 유형특징적용 시나리오
압축 없음데이터를 압축하지 않습니다.데이터가 이미 압축되어 있거나 스토리지 공간이 병목이 아닌 경우.
LZ4압축 및 압축 해제 속도가 매우 빠르며 압축률은 보통입니다.실시간 쿼리, 동시성이 높은 워크로드 등 빠른 압축 해제가 필요한 경우.
LZ4F더 유연한 압축 설정을 지원하는 LZ4 확장 버전으로, 속도가 빠르고 압축률은 보통입니다.빠른 압축과 세밀한 설정 제어가 필요한 경우.
LZ4HCLZ4보다 압축률이 높지만 압축 속도는 느립니다. 압축 해제 속도는 LZ4와 비슷합니다.압축 해제 속도가 중요하면서 더 높은 압축률도 필요한 경우.
ZSTD (Zstandard)압축률이 높고 압축 수준을 유연하게 조정할 수 있으며, 압축률이 높아도 압축 해제 속도가 빠릅니다.높은 스토리지 효율과 우수한 쿼리 성능이 모두 필요한 경우.
Snappy주로 빠른 압축 해제를 위해 설계되었으며 압축률은 보통입니다.빠른 압축 해제가 필요하고 CPU 리소스가 제한적인 경우.
Zlib압축률과 속도 사이의 균형이 좋습니다. 압축 및 압축 해제 속도는 느리지만 압축률은 더 높습니다.아카이빙, 콜드 데이터 저장 등 압축 해제 속도에 민감하지 않은 경우.

압축의 동작 방식​

Doris의 압축은 여러 계층이 함께 작동하여 구현됩니다.

컬럼별 압축​

Doris는 컬럼형 스토리지를 사용하므로 테이블의 각 컬럼을 독립적으로 압축합니다. 같은 컬럼의 데이터는 대체로 분포 특성이 비슷하므로 컬럼별 압축은 행별 압축보다 압축 효율이 높습니다.

압축 전 인코딩​

Doris는 압축을 수행하기 전에 먼저 컬럼 데이터를 인코딩합니다. 데이터를 압축에 더 적합한 형태로 변환하여 압축률을 더욱 높입니다. 일반적인 인코딩 방식은 다음과 같습니다.

  • 사전 인코딩: 반복되는 문자열을 더 짧은 사전 ID로 대체합니다.
  • 런 길이 인코딩(RLE): 연속으로 반복되는 값을 "값 + 반복 횟수"로 표현합니다.

페이지별 압축​

Doris는 페이지 단위 압축 전략을 사용합니다.

  1. 각 컬럼의 데이터를 여러 페이지로 나눕니다.
  2. 각 페이지의 데이터를 독립적으로 압축합니다.
  3. 쿼리 실행 시 필요한 페이지만 압축을 해제하여 컬럼 전체를 스캔하지 않도록 합니다.

페이지별 압축은 압축률과 압축 해제 성능 사이의 균형을 유지하면서 대규모 데이터셋을 효율적으로 처리할 수 있습니다.

스토리지 포맷 V3 최적화​

Doris 스토리지 포맷 V3부터 숫자형 데이터의 인코딩 전략이 더욱 최적화되었습니다.

  • 정수형은 기본적으로 PLAIN_ENCODING을 사용합니다.
  • LZ4 또는 ZSTD 압축과 함께 사용하면 읽기 처리량이 높아지고 CPU 오버헤드가 줄어듭니다.

자세한 내용은 스토리지 포맷 V3를 참조하세요.

설정 가능한 압축 전략​

테이블을 생성할 때 압축 알고리즘을 지정하여 실제 워크로드에 맞게 압축 효율과 쿼리 성능 사이의 균형을 최적으로 조정할 수 있습니다.

압축에 영향을 주는 요인​

압축 효과는 선택한 알고리즘뿐 아니라 데이터 자체의 특성에도 영향을 받습니다.

요인설명
데이터의 순차성타임스탬프나 연속된 숫자 값처럼 데이터 순서가 규칙적일수록 압축 알고리즘이 반복 패턴을 더 쉽게 식별할 수 있어 압축률이 높아집니다.
데이터 중복도컬럼에 반복되는 값이 많을수록 압축 효과가 좋습니다. 사전 인코딩은 중복도가 높은 데이터에 특히 효과적입니다.
데이터 타입숫자형(정수, 부동 소수점 수)은 일반적으로 문자열형보다 압축하기 쉽습니다. 값의 범위가 넓을수록 압축에 미치는 영향도 커집니다.
컬럼 길이짧은 컬럼은 일반적으로 긴 컬럼보다 압축하기 쉽습니다. 압축 알고리즘이 짧은 데이터 블록에서 반복 패턴을 더 효율적으로 찾을 수 있기 때문입니다.
NULL 값 비율NULL 값의 비율이 높으면 압축 알고리즘이 이를 특수 패턴으로 인코딩하여 스토리지 공간을 더 줄일 수 있습니다.

Doris에서 압축 설정하기​

테이블을 생성할 때 compression 매개변수를 PROPERTIES에 설정하여 압축 알고리즘을 지정합니다.

CREATE TABLE example_table (
id INT,
name STRING,
age INT
)
DUPLICATE KEY(id)
DISTRIBUTED BY HASH(id) BUCKETS 10
PROPERTIES (
"compression" = "zstd"
);

compression에 지정할 수 있는 값은 none, lz4, lz4f, lz4hc, zstd, snappy, zlib입니다. 명시적으로 지정하지 않으면 Doris는 기본 압축 알고리즘인 ZSTD를 사용합니다(FE 설정 default_compression_type으로 제어).