Liquid Clustering은 Microsoft Fabric 델타 테이블에 대한 유연한 데이터 레이아웃 전략입니다. 정적 Hive 스타일 분할 및 수동 Z-Order 유지 관리를 선언적이고 변경 친화적인 클러스터링으로 대체합니다. 클러스터할 열을 정의하고 Fabric Spark 런타임에서 실제 데이터 레이아웃을 자동으로 처리합니다.
이 문서의 사용 용도:
- 액체 클러스터링의 작동 방식과 사용 시기를 이해합니다.
- 액체 클러스터링을 분할 및 Z-Order와 비교합니다.
- 테이블에서 클러스터링을 구성합니다.
- 증분 액체 클러스터링(런타임 2.0 이상)을 이해합니다.
- 세션 구성을 사용하여 클러스터링 동작을 조정합니다.
액체 클러스터링이란?
Liquid 클러스터링에서는 델타 테이블 파일의 데이터를 구성하여 클러스터링 열에서 값이 비슷한 행이 공동 배치되도록 합니다. 레이아웃을 사용하면 쿼리 실행 중에 향상된 파일 건너뛰기를 사용할 수 있습니다. 쿼리가 클러스터링 열을 필터링할 때 엔진은 값 범위가 조건자와 일치하는 파일만 읽고 나머지는 건너뜁니다.
분할과 달리 액체 클러스터링:
- 열 값당 실제 디렉터리 구조를 만들지 않습니다.
- 테이블을 만들 때 클러스터링 열을 선택할 필요가 없습니다(나중에 변경할 수 있습니다).
- 수천 개의 작은 파티션에서 잠재적인 작은 파일 문제를 만들지 않고 높은 카디널리티 열을 처리합니다.
- 쓰기 시간이 아닌 동안
OPTIMIZE레이아웃 최적화를 적용합니다.
파티셔닝 및 Z-Order 대비 이점
Liquid 클러스터링에서는 진화하는 데이터 패턴의 유연성, 유지 관리 및 처리 측면에서 Hive 스타일 분할 및 Z 순서에 비해 상당한 이점을 제공합니다.
Hive 스타일 파티셔닝과 비교하면
| Aspect | Hive 스타일 파티셔닝 | 액체 군집화 |
|---|---|---|
| 세분성 | 고유 값당 하나의 디렉터리(또는 조합) | 파일 수준 값 범위, 디렉터리 없음 |
| 높은 카디널리티 | 수천 개의 작은 파일/디렉터리를 생성합니다. | 자연스럽게 처리하며, 데이터를 적절한 크기의 파일로 분할 저장합니다. |
| 열 변경 내용 | 전체 테이블 다시 쓰기 필요 |
ALTER TABLE ... CLUSTER BY 다음에 적용됩니다. OPTIMIZE |
| 쓰기 경로 | 파티션 열은 쓰기 시점에 알 수 있어야 합니다. | 어떤 열이든 나중에 클러스터링할 수 있습니다. |
| 작은 파일 문제 | 스트리밍 또는 잦은 삽입 작업에서 흔히 발생함 |
OPTIMIZE 압축으로 관리됨 |
Z-Order와 비교하면
| Aspect | Z-Order | 액체 군집화 |
|---|---|---|
| 열 변경 내용 | 새 열을 사용하여 OPTIMIZE ZORDER BY (...)를 다시 실행해야 합니다. |
ALTER TABLE ... CLUSTER BY 정의를 유지합니다. |
| 점진적 지원 | 증분 모드 없음; 수동으로 범위를 제한하는 데 사용 WHERE |
증분 모드(런타임 2.0 이상)는 새 파일, 변경된 파일 또는 비정상 파일만 자동으로 처리합니다. |
| Metadata | 영구적인 열 정의가 없음 | 테이블 메타데이터에 저장된 클러스터링 열 |
| 다중 열 레이아웃 | 최적화 시 적용되는 Z 순서 곡선 | 하나의 클러스터링 열에 대한 Z 순서; 최적화된 데이터 지역성을 제공하는 2개 이상의 열에 대한 Hilbert 곡선 |
Liquid 클러스터링에서는 단일 열 레이아웃에 Z-Order를 사용하고 2개 이상의 열에 대해 Hilbert 곡선을 사용합니다. 이는 다차원 클러스터링에 Z 순서 곡선만 적용하는 Z-Order보다 개선되었습니다. Liquid 클러스터링은 지속적인 유지 관리 비용을 줄이는 메타데이터 인식 증분 프레임워크로 두 알고리즘을 모두 통합합니다.
액체 클러스터형 테이블 만들기
테이블을 만들 때 절을 CLUSTER BY 사용하여 클러스터링 열을 정의합니다.
-- Create a new clustered table
CREATE TABLE dbo.sales (
order_id BIGINT,
order_date DATE,
region STRING,
amount DECIMAL(10,2)
) CLUSTER BY (order_date, region);
-- Create from query results
CREATE TABLE dbo.sales_clustered
CLUSTER BY (order_date, region)
AS SELECT * FROM raw_sales;
-- Enable on existing table
ALTER TABLE dbo.sales_txn CLUSTER BY (order_date, region);
클러스터링 열 변경
분할과 달리 데이터를 다시 작성하지 않고 언제든지 클러스터링 열을 변경할 수 있습니다.
-- Change clustering columns
ALTER TABLE sales CLUSTER BY (region, product_category);
-- Remove clustering (table becomes unclustered)
ALTER TABLE sales CLUSTER BY NONE;
클러스터링 열을 변경한 후 다음 OPTIMIZE 실행에 새 레이아웃이 적용됩니다. 기존 파일은 다시 클러스터될 때까지 이전 레이아웃을 유지합니다.
OPTIMIZE를 사용하여 클러스터링 적용
클러스터링이 명령 중에 적용됩니다 OPTIMIZE . 클러스터링 정의가 테이블 메타데이터에 저장되므로 문에 OPTIMIZE 열을 지정할 필요가 없습니다.
-- Cluster the table using the defined clustering columns
OPTIMIZE sales;
-- Recluster partial Z-Cubes and Z-Cubes with different clustering keys or clustering providers
OPTIMIZE sales FULL;
클러스터링 키를 변경하고 현재 클러스터링 전략을 준수하지 않는 Z 큐브를 다시 빌드하려는 경우에 사용합니다 OPTIMIZE FULL .
Z 큐브는 동일한 클러스터링 열을 공유하는 파일을 그룹화하기 위해 사용되는 논리적 단위 액체 클러스터링입니다. 클러스터 키가 변경되거나 데이터 양이 100GB를 초과할 때까지 데이터는 단일 Z 큐브로 클러스터됩니다.
Tip
Fabric 런타임 2.0부터 Native 실행 엔진은 리퀴드 클러스터형 테이블에서 OPTIMIZE을 수행할 수 있으며, 30~50% 더 빠른 다차원 클러스터링 성능을 제공합니다. 이전 런타임은 일반적인 비가속 Spark 실행으로 전환됩니다.
액체 클러스터링 작동 방식
액체 클러스터형 테이블에서 실행 OPTIMIZE 하면 다음이 발생합니다.
-
파일 선택: 엔진이 클러스터링이 필요한 파일을 선택합니다.
- 런타임 2.0 이상(증분 클러스터링 전략)에서는 비클러스터형, 비정상 파일, 작은 파일 또는 삭제 벡터 파일만 선택됩니다.
- 런타임 1.3에서는 100GB보다 작은 모든 Z 큐브 내의 모든 파일이 이미 잘 클러스터되어 있는지 여부에 관계없이 선택됩니다.
- Bin 압축: 선택한 파일은 최적의 출력 파일 크기를 대상으로 하는 bin으로 그룹화됩니다.
- 다시 분할: 각 bin 내의 데이터는 공간 채우기 곡선(다중 열의 경우 Hilbert 곡선, 단일 열의 경우 Z 순서)을 사용하여 다시 분할됩니다.
- 파일 쓰기: 다시 분할된 데이터는 클러스터링 열에서 값 범위가 좁은 새 파일로 작성됩니다.
- 메타데이터 업데이트: 델타 로그는 파일 교체를 기록하며 클러스터링 메타데이터를 사용하여 새 파일에 태그를 지정합니다.
그 결과 클러스터링 열에서 오버랩되지 않는(또는 최소 겹치는) 값 범위가 있는 파일이 생성되므로 엔진이 쿼리 조건자와 일치하지 않는 파일을 건너뛸 수 있습니다.
Caution
Fabric 런타임 1.3(델타 3.2): 액체 클러스터링을 신중하게 사용합니다. 이 런타임에서 Liquid 클러스터링에서는 전체 Z-Cube 재작성 전략을 사용합니다. Z-Cube 내의 모든 파일은 실행마다 다시 작성됩니다. Z 큐브는 크기가 100GB를 초과하는 경우에만 유지됩니다(건너뛰기). 100GB보다 작은 테이블의 경우 전체 다시 쓰기는 데이터가 이미 잘 클러스터된 경우에도 모든 OPTIMIZE 실행이 모든 테이블 데이터를 다시 작성한다는 것을 의미합니다. 이로 인해 심각한 쓰기 증폭이 발생합니다.
- 런타임 1.3에서는 액체 클러스터링과 함께 자동 압축을 사용하지 마세요. 모든 자동 압축 트리거는 새/변경된 데이터를 클러스터링하는 대신 전체 테이블을 다시 작성할 수 있습니다.
- 모든 쓰기 작업 후에
OPTIMIZE를 실행하지 마세요. 런타임 1.3에서는 클러스터링을 전략적으로 계획된 실행으로 제한하고, 그 사이에는 클러스터링 최신성이 다소 낮아지는 것을 감수합니다.
이 쓰기 증폭을 제거하는 증분 액체 클러스터링은 Fabric 런타임 2.0부터만 사용할 수 있습니다.
증분 액체 클러스터링
Fabric 런타임 2.0(Delta 4.1)부터 액체 클러스터링에서는 기본적으로 증분 클러스터링 전략을 사용합니다. 증분 전략은 표준 클러스터링 동작보다 크게 개선된 것입니다.
Important
증분 액체 클러스터링은 Fabric 런타임 2.0 이상에서만 사용할 수 있습니다. 이전 런타임 OPTIMIZE 에서는 Z-Cube 내의 모든 파일이 실행 시 다시 작성되는 표준(전체 다시 쓰기) 동작을 사용합니다.
증분 클러스터링 전략이 중요한 이유
표준 클러스터링 알고리즘은 이미 잘 클러스터되어 있는지 여부에 관계없이 모든 실행에서 Z-Cube(최대 100GB) 내의 OPTIMIZE 파일을 다시 작성합니다. 작은 추가를 수신하는 테이블의 경우 클러스터링 비용은 새 데이터의 양이 아니라 테이블 크기에 따라 선형적으로 증가합니다.
증분 모드는 실제로 클러스터링이 필요한 파일만 선택하여 전체 다시 쓰기 문제를 해결합니다.
- 비클러스터형 파일: 메타데이터를 클러스터링하지 않고 새로 작성된 데이터
- 작은 파일: 대상 파일 크기 임계값 미만의 파일
- 삭제 벡터가 있는 파일: 삭제가 누적되어 정리 임계값을 초과하는 파일
이미 적절히 클러스터링되어 있고 크기도 적절한 파일은 아예 건너뜁니다.
자동 클러스터링
증분 액체 클러스터링에는 시간이 지남에 따라 클러스터링 품질을 유지하기 위해 자동 겹침 감지( 자동 클러스터링이라고 함)가 포함됩니다. 새 데이터가 도착하면 파일 값 범위 간에 겹침을 만들어 데이터를 건너뛰는 효율성을 저하할 수 있습니다. 자동 클러스터링에서는 파일에서 겹치는 값 범위를 검색하고 영향을 받는 파일만 선택적으로 클러스터링합니다.
자동 리클러스터링은 클러스터링할 새 데이터나 변경된 데이터가 있을 때마다 OPTIMIZE의 일부로 자동으로 실행됩니다. 수동 개입이나 예약된 전체 리클러스터링은 필요하지 않습니다. 증분 클러스터링 전략은 데이터가 발전함에 따라 거의 최적의 클러스터링 품질을 유지합니다.
전체 다시 쓰기 동작으로 되돌리기
증분 클러스터링 전략을 사용하지 않도록 설정하고 전체 다시 쓰기 동작을 사용해야 하는 경우 다음 구성을 설정합니다.
SET spark.microsoft.delta.optimize.clustering.strategy.incremental = FALSE;
OPTIMIZE sales;
또는 세션 설정을 변경하지 않고 일회성 전체 리클러스터링을 수행하려면 OPTIMIZE FULL를 사용합니다:
OPTIMIZE sales FULL;
메모
증분 클러스터링 전략은 의도적으로 이론적으로 최적 레이아웃에서 사소한 편차를 허용하여 쓰기 증폭을 크게 줄입니다.
OPTIMIZE FULL을 실행하면 Z-큐브를 이론적 최적 상태로 완전히 재구성하여 그 격차를 해소하지만, 더 높은 쓰기 비용이 듭니다.
구성 참조
다음 세션 구성은 Fabric 런타임 2.0 이상에서 액체 클러스터링 동작을 제어합니다.
증분 클러스터링
| 구성 / 설정 | Type | 기본값 | 설명 |
|---|---|---|---|
spark.microsoft.delta.optimize.clustering.strategy.incremental |
Boolean | true |
증분 클러스터링을 위한 마스터 스위치입니다.
true인 경우, OPTIMIZE는 클러스터링되지 않은 파일, 비정상적인 파일, 소형 파일 및 삭제 벡터 파일만 처리합니다. 크기 false가 100GB 미만인 Z 큐브의 모든 파일을 다시 작성합니다(표준 동작). |
spark.microsoft.delta.optimize.clustering.strategy.incremental.autoRecluster |
Boolean | true |
데이터 범위가 겹치는 파일을 자동으로 검색하고 다시 클러스터링할 수 있습니다. 증분 클러스터링을 사용하는 경우에만 적용됩니다. |
자동 클러스터 튜닝
이러한 구성은 자동 클러스터링의 민감도 및 범위를 제어합니다. 기본값은 대부분의 워크로드에 적합합니다. 클러스터링 품질과 쓰기 증폭 간의 장차를 변경해야 하는 경우에만 조정합니다.
| 구성 / 설정 | Type | 기본값 | 설명 |
|---|---|---|---|
spark.microsoft.delta.optimize.clustering.strategy.incremental.autoRecluster.minOffendingFiles |
정수 (Int) | 4 |
다시 클러스터링을 트리거하는 데 필요한 최소 겹치는 파일 수입니다. 값이 낮을수록 더 빨리 클러스터링됩니다(쿼리 성능 향상, 쓰기 비용 높아). ≥ 2여야 합니다. |
spark.microsoft.delta.optimize.clustering.strategy.incremental.autoRecluster.minOverlapThreshold |
Double | 0.75 |
클러스터링 차원은 점수 임계값과 겹칩니다. 이 값보다 높은 점수가 매칭되는 파일 쌍은 겹치는 것으로 간주됩니다. 범위(0.25, 1.0)에 있어야 합니다. 값이 낮을수록 공격적입니다. |
클러스터링 열 선택
최상의 결과를 위해 가장 일반적인 쿼리 필터 패턴에 따라 클러스터링 열을 선택합니다.
- 절에 자주 나타나는
WHERE. 열이 많아질수록 공간 채움 곡선의 열별 파일 건너뛰기 효과가 약해지고, 데이터를 클러스터링하는 데 걸리는 시간이 늘어납니다. - 열 카디널리티를 고려합니다. 카디널리티가 낮은 열은 고유 값 범위를 더 적게 생성하므로 카디널리티가 높은 클러스터링 키와 결합할 때 파일 건너뛰기 이점이 줄어듭니다.
-
열 순서는 클러스터링에 영향을 주지 않습니다. 다음에
CLUSTER BY지정된 열의 순서는 결과 다차원 클러스터링에 영향을 주지 않습니다.
지원되는 열 유형
모든 열 형식을 클러스터링 키로 사용할 수 있는 것은 아닙니다. 엔진은 각 열의 데이터 형식을 평가하여 자격을 결정합니다.
항상 적격(원자성 형식):
-
NumericType(ByteType, ,ShortType,IntegerTypeLongType,FloatTypeDoubleType,DecimalType) DateTypeTimestampTypeTimestampNTZTypeStringType
조건부 적격:
메모
다음 형식은 Fabric Spark 런타임 2.0(Delta 4.1)부터 사용하도록 설정할 수 있습니다.
-
StructType:spark.microsoft.delta.clusteredTable.complexTypes.enabled이 활성화되어 있고, 모든 리프 필드가 모두 적격한 유형인 경우. -
ArrayType:spark.microsoft.delta.clusteredTable.complexTypes.enabled이(가) 활성화되어 있고 요소 유형이 적용 가능한 경우. -
MapType: 활성화된 경우spark.microsoft.delta.clusteredTable.complexTypes.enabled키 및 값 형식이 모두 순서가 지정되고 적격합니다.
자격이 없음:
BinaryTypeBooleanTypeNullType
파일 수준 통계에 사용되는 해당 적격 형식은 파일 건너뛰기-적격 데이터 형식을 참조하세요.
다른 기능과의 상호 작용
| 특징 | 작동 방식 |
|---|---|
| Partitioning | 호환되지 않습니다. 파일 스키핑을 위해서는 파티셔닝보다 리퀴드 클러스터링을 사용하는 것이 좋습니다. |
| Z 순서 | 호환되지 않습니다. 파일 건너뛰기 용도로는 Z-Order를 통해 액체 클러스터링을 사용하는 것이 좋습니다. |
| 빠른 최적화 | 런타임 2.0부터 호환 가능합니다. 이전 런타임에서는 빠른 최적화가 액체 클러스터형 테이블에 영향을 주지 않습니다. 이 중에 OPTIMIZE는 작은 파일이 부족하거나 데이터가 부족하여 정상 크기의 출력 파일을 생성할 수 없는 경우 클러스터링을 건너뜁니다. |
| 적응형 대상 파일 크기 | 호환. 적응형 평가에 의해 설정된 대상 파일 크기는 클러스터링의 대상 크기로 사용됩니다. |
| 쓰기 최적화 | 호환. 쓰기 시 통합 파일을 생성한 다음, OPTIMIZE 동안 클러스터링됩니다. |
| 자동 압축 | 런타임 1.3 이하에서는 액체 클러스터링과 함께 사용하지 마세요. 이러한 런타임에서 모든 자동 압축 트리거는 100GB보다 작은 Z 큐브의 모든 데이터를 다시 작성하여 심각한 쓰기 증폭을 유발합니다. 런타임 2.0 이상에서는 자동 컴팩션을 사용할 수 있습니다. 증분 클러스터링을 통해 새 파일이나 상태가 좋지 않은 파일만 다시 기록됩니다. 자동 압축은 작은 파일 통합을 처리합니다. OPTIMIZE 는 클러스터링 레이아웃을 처리합니다. |
| 삭제 벡터 | 삭제된 행 임계값을 초과하는 파일은 클러스터링 상태와 관계없이 클러스터링에 대해 선택됩니다. |
| V-Order | 호환. V 주문 및 액체 클러스터링이 서로 다른 축(파일 내부 레이아웃과 파일 간 값 범위)에서 작동합니다. 둘 다 함께 적용할 수 있습니다. |
모범 사례
-
OPTIMIZE정기적으로 실행하세요. 일괄 쓰기 후에 또는 스트리밍 테이블의 일정에 따라 실행하되, 자주 실행해도 비용 부담이 적은 증분 클러스터링 전략이 적용되는 Runtime 2.0+에서만 사용하세요. 런타임 1.3 이하에서는 모든OPTIMIZE실행이 100GB 미만의 Z 큐브의 모든 데이터를 다시 작성하므로 실행은 의도적이고 자주 실행되지 않아야 합니다. -
아쉽게 사용합니다
OPTIMIZE FULL. 클러스터링 열을 변경하거나 일회성 품질 재설정이 필요한 경우 이를 예약합니다. - Spark UI 또는 쿼리 계획에서 쿼리 검색 메트릭(검색된 파일 및 총 파일)을 확인하여 클러스터링 품질을 모니터링합니다.
- 스트리밍 워크로드에 대한 최적화 쓰기와 결합하여 각 마이크로 일괄 처리가 클러스터링을 위해 관리 가능한 수의 파일을 생성하도록 합니다.