다음을 통해 공유


델타 테이블에 액체 클러스터링 사용

Delta Lake Liquid 클러스터링이 테이블 분할 및 ZORDER 대체하여 데이터 레이아웃 결정을 간소화하고 쿼리 성능을 최적화합니다. Liquid 클러스터링은 기존 데이터를 다시 작성하지 않고도 클러스터링 키를 다시 정의할 수 있는 유연성을 제공하므로 시간이 지남에 따라 분석 요구 사항과 함께 데이터 레이아웃을 발전시킬 수 있습니다.

Important

Databricks는 액체 클러스터링을 사용하는 모든 테이블에 Databricks Runtime 15.2 이상을 사용하는 것이 좋습니다. 제한 사항이 있는 공개 미리 보기 지원은 Databricks Runtime 13.3 LTS 이상에서 사용할 수 있습니다.

참고 항목

Liquid 클러스터링을 사용하도록 설정된 테이블은 Databricks Runtime 13.3 LTS 이상에서 행 수준 동시성을 지원합니다. 행 수준 동시성은 일반적으로 삭제 벡터가 활성화된 모든 테이블에 대해 Databricks Runtime 14.2 이상에서 사용할 수 있습니다. Azure Databricks의 격리 수준 및 쓰기 충돌을 참조하세요.

액체 클러스터링이 사용되는 용도는 무엇인가요?

Databricks는 모든 새 델타 테이블에 액체 클러스터링을 권장합니다. 다음은 클러스터링의 이점을 활용하는 시나리오의 예입니다.

  • 테이블은 높은 카디널리티 열로 필터링되는 경우가 많습니다.
  • 데이터 분포에 상당한 오차가 있는 테이블입니다.
  • 빠르게 증가하고 유지 관리 및 튜닝 노력이 필요한 테이블입니다.
  • 동시 쓰기 요구 사항이 있는 테이블입니다.
  • 시간이 지남에 따라 변경되는 액세스 패턴이 있는 테이블입니다.
  • 파티션 키의 선택에 따라 테이블에 너무 많거나 너무 적은 파티션이 생성될 수 있는 테이블.

액체 클러스터링 사용

기존 테이블 또는 테이블을 만드는 동안 액체 클러스터링을 사용하도록 설정할 수 있습니다. 클러스터링이 분할 또는 ZORDER호환되지 않으므로 Azure Databricks를 사용하여 테이블의 데이터에 대한 모든 레이아웃 및 최적화 작업을 관리해야 합니다. Liquid 클러스터링을 사용하도록 설정한 후 평소와 같이 작업을 실행 OPTIMIZE 하여 데이터를 증분 방식으로 클러스터합니다. 클러스터링을 트리거하는 방법을 참조 하세요.

액체 클러스터링을 사용하도록 설정하려면 아래 예제와 같이 테이블 만들기 문에 CLUSTER BY 구를 추가합니다.

참고 항목

Databricks Runtime 14.2 이상에서는 Python 또는 Scala에서 DataFrame API 및 DeltaTable API를 사용하여 액체 클러스터링을 사용하도록 설정할 수 있습니다.

SQL

-- Create an empty table
CREATE TABLE table1(col0 int, col1 string) CLUSTER BY (col0);

-- Using a CTAS statement
CREATE EXTERNAL TABLE table2 CLUSTER BY (col0)  -- specify clustering after table name, not in subquery
LOCATION 'table_location'
AS SELECT * FROM table1;

-- Using a LIKE statement to copy configurations
CREATE TABLE table3 LIKE table1;

Python

# Create an empty table
(DeltaTable.create()
  .tableName("table1")
  .addColumn("col0", dataType = "INT")
  .addColumn("col1", dataType = "STRING")
  .clusterBy("col0")
  .execute())

# Using a CTAS statement
df = spark.read.table("table1")
df.write.clusterBy("col0").saveAsTable("table2")

# CTAS using DataFrameWriterV2
df = spark.read.table("table1")
df.writeTo("table1").using("delta").clusterBy("col0").create()

Scala

// Create an empty table
DeltaTable.create()
  .tableName("table1")
  .addColumn("col0", dataType = "INT")
  .addColumn("col1", dataType = "STRING")
  .clusterBy("col0")
  .execute()

// Using a CTAS statement
val df = spark.read.table("table1")
df.write.clusterBy("col0").saveAsTable("table2")

// CTAS using DataFrameWriterV2
val df = spark.read.table("table1")
df.writeTo("table1").using("delta").clusterBy("col0").create()

Databricks Runtime 16.0 이상에서는 다음 예제와 같이 구조적 스트리밍 쓰기를 사용하여 액체 클러스터링을 사용하도록 설정된 테이블을 만들 수 있습니다.

Python

(spark.readStream.table("source_table")
  .writeStream
  .clusterBy("column_name")
  .option("checkpointLocation", checkpointPath)
  .toTable("target_table")
)

Scala

spark.readStream.table("source_table")
  .writeStream
  .clusterBy("column_name")
  .option("checkpointLocation", checkpointPath)
  .toTable("target_table")

Warning

액체 클러스터링을 사용하도록 설정된 테이블은 만들 때 다양한 델타 테이블 기능을 사용하도록 설정하고 Delta 기록기 버전 7 및 판독기 버전 3을 사용합니다. 이러한 기능 중 일부의 사용을 재정의할 수 있습니다. 기본 기능 사용(선택 사항) 재정의를 참조하세요.

테이블 프로토콜 버전을 다운그레이드할 수 없으며 클러스터링이 설정된 테이블은 모든 사용 델타 판독기 프로토콜 테이블 기능을 지원하지 않는 Delta Lake 클라이언트에서 읽을 수 없습니다. Azure Databricks에서 Delta Lake 기능 호환성을 관리하는 방법을 참조하세요.

다음 구문을 사용하여 분할되지 않은 기존 Delta 테이블에서 Liquid 클러스터링을 사용하도록 설정할 수 있습니다.

ALTER TABLE <table_name>
CLUSTER BY (<clustering_columns>)

Important

기본 동작은 이전에 작성된 데이터에 클러스터링을 적용하지 않습니다. 모든 레코드에 대해 강제로 다시 클러스터링을 수행하려면 OPTIMIZE FULL을 사용해야 합니다. 모든 레코드에 대한 강제 클러스터링을 참조하세요.

기본 기능 사용 재정의(선택 사항)

액체 클러스터링 사용 중에 델타 테이블 기능을 사용하도록 설정하는 기본 동작을 재정의할 수 있습니다. 이렇게 하면 해당 테이블 기능과 연결된 판독기 및 기록기 프로토콜이 업그레이드되지 않습니다. 다음 단계를 완료하려면 기존 테이블이 있어야 합니다.

  1. ALTER TABLE 사용하여 하나 이상의 기능을 사용하지 않도록 설정하는 테이블 속성을 설정합니다. 예를 들어 삭제 벡터를 사용하지 않도록 설정하려면 다음을 실행합니다.

    ALTER TABLE table_name SET TBLPROPERTIES ('delta.enableDeletionVectors' = false);
    
  2. 다음을 실행하여 테이블에서 Liquid 클러스터링을 활성화하세요.

    ALTER TABLE <table_name>
    CLUSTER BY (<clustering_columns>)
    

다음 표에서는 재정의할 수 있는 델타 기능과 사용이 Databricks 런타임 버전과의 호환성에 미치는 영향에 대한 정보를 제공합니다.

델타 기능 런타임 호환성 사용 설정을 재정의할 속성 비활성화가 액체 클러스터링에 미치는 영향
삭제 벡터 읽기 및 쓰기에는 Databricks Runtime 12.2 LTS 이상이 필요합니다. 'delta.enableDeletionVectors' = false 행 수준 동시성이 비활성화되어 트랜잭션 및 클러스터링 작업이 충돌할 가능성이 높아집니다. 행 수준 동시성과의 쓰기 충돌을 참조하세요.

DELETE, MERGE명령 UPDATE 이 느리게 실행될 수 있습니다.
행 추적 쓰기에는 Databricks Runtime 13.3 LTS 이상이 필요합니다. Databricks 런타임 버전에서 읽을 수 있습니다. 'delta.enableRowTracking' = false 행 수준 동시성이 비활성화되어 트랜잭션 및 클러스터링 작업이 충돌할 가능성이 높아집니다. 행 수준 동시성과의 쓰기 충돌을 참조하세요.
검사점 V2 읽기 및 쓰기에는 Databricks Runtime 13.3 LTS 이상이 필요합니다. 'delta.checkpointPolicy' = 'classic' 액체 클러스터링 동작에 영향을 주지 않습니다.

클러스터링 키 선택

Databricks는 쿼리 필터에서 가장 자주 사용되는 열을 기반으로 클러스터링 키를 선택하는 것이 좋습니다. 클러스터링 키는 순서에 따라 정의할 수 있습니다. 두 열의 상관 관계가 높은 경우 해당 열 중 하나만 클러스터링 키로 포함하면 됩니다.

최대 4개의 클러스터링 키를 지정할 수 있습니다. 작은 테이블(10TB 미만)의 경우 더 많은 클러스터링 키(예: 4개)를 사용하면 클러스터링 키를 적게 사용하는 것에 비해 단일 열에서 필터링할 때 성능이 저하될 수 있습니다(예: 2개). 그러나 테이블 크기가 증가함에 따라 단일 열 쿼리에 더 많은 클러스터링 키를 사용하는 경우의 성능 차이는 무시할 수 있습니다.

통계가 클러스터링 키로 수집된 열만 지정할 수 있습니다. 기본적으로 Delta 테이블의 처음 32개 열에는 통계가 수집됩니다. 델타 통계 열지정을 참조하세요.

클러스터링에서는 클러스터링 키에 대해 다음 데이터 형식을 지원합니다.

  • 날짜
  • Timestamp
  • TimestampNTZ(Databricks Runtime 14.3 LTS 이상 필요)
  • 문자열
  • 정수
  • Long
  • Short
  • Float
  • 두 배
  • 소수
  • Byte

기존 테이블을 변환하는 경우 다음 권장 사항을 고려하세요.

현재 데이터 최적화 기술 클러스터링 키에 대한 권장 사항
Hive 스타일 분할 파티션 열을 클러스터링 키로 사용합니다.
Z 순서 인덱싱 ZORDER BY 열을 클러스터링 키로 사용합니다.
Hive 스타일 분할 및 Z 순서 파티션 열과 ZORDER BY 열을 모두 클러스터링 키로 사용합니다.
카디널리티를 줄이기 위해 생성된 열(예: 타임스탬프의 날짜) 원래 열을 클러스터링 키로 사용하고 생성된 열을 만들지 않습니다.

클러스터형 테이블에 데이터 쓰기

Liquid 클러스터링에서 사용하는 모든 델타 쓰기 프로토콜 테이블 기능을 지원하는 Delta 기록기 클라이언트를 사용해야 합니다. Azure Databricks에서는 Databricks Runtime 13.3 LTS 이상을 사용해야 합니다.

쓰기에 클러스터되는 작업에는 다음이 포함됩니다.

  • INSERT INTO 작업
  • CTASRTAS
  • COPY INTO Parquet 형식에서
  • spark.write.mode("append")

구조적 스트리밍 쓰기는 쓰기에 클러스터링을 트리거하지 않습니다. 추가 제한 사항이 적용됩니다. 제한 사항 보기.

쓰기 시 클러스터링은 트랜잭션의 데이터가 크기 임계값을 충족하는 경우에만 트리거됩니다. 이러한 임계값은 클러스터링 열 수에 따라 다르며 Unity 카탈로그 관리 테이블의 경우 다른 델타 테이블보다 낮습니다.

클러스터링 열 수 Unity 카탈로그 관리 테이블의 임계값 크기 다른 델타 테이블의 임계값 크기
1 64MB 256MB
2 256MB 1GB
3 512MB 2GB
4 1GB 4GB

모든 작업이 액체 클러스터링을 적용하는 것은 아니므로 Databricks는 모든 데이터가 효율적으로 클러스터링되도록 자주 실행하는 OPTIMIZE 것이 좋습니다.

클러스터링을 트리거하는 방법

예측 최적화는 사용하도록 설정된 테이블에 대한 OPTIMIZE 명령을 자동으로 실행합니다. Unity 카탈로그 관리 테이블에 대한 예측 최적화를 참조하세요.

클러스터링을 트리거하려면 Databricks Runtime 13.3 LTS 이상을 사용해야 합니다. 다음 예제와 같이 테이블에서 OPTIMIZE 명령을 사용합니다.

OPTIMIZE table_name;

Liquid 클러스터링이 증분이므로 클러스터링해야 하는 데이터를 수용하기 위해 필요에 따라 데이터만 다시 작성됩니다. 클러스터링할 데이터와 일치하지 않는 클러스터링 키가 있는 데이터 파일은 다시 작성되지 않습니다.

최상의 성능을 위해 Databricks는 일반 OPTIMIZE 작업을 클러스터 데이터에 예약하는 것이 좋습니다. 많은 업데이트 또는 삽입이 발생하는 테이블의 경우 Databricks는 1~2시간마다 OPTIMIZE 작업을 예약하는 것이 좋습니다. 액체 클러스터링이 증분이므로 클러스터형 테이블에 대한 대부분의 OPTIMIZE 작업이 빠르게 실행됩니다.

모든 레코드에 대한 강제 재클러스터링

Databricks Runtime 16.0 이상에서는 다음 구문을 사용하여 테이블의 모든 레코드를 강제로 다시 클러스터링할 수 있습니다.

OPTIMIZE table_name FULL;

Important

OPTIMIZE FULL 실행하면 필요에 따라 모든 기존 데이터가 클러스터링됩니다. 이전에 지정된 키에 클러스터되지 않은 큰 테이블의 경우 이 작업에 몇 시간이 걸릴 수 있습니다.

처음으로 클러스터링을 사용하도록 설정하거나 클러스터링 키를 변경할 때 OPTIMIZE FULL 실행합니다. 이전에 OPTIMIZE FULL 실행했으며 클러스터링 키가 변경되지 않은 경우 OPTIMIZE FULLOPTIMIZE동일하게 실행됩니다. 항상 OPTIMIZE FULL 사용하여 데이터 레이아웃이 현재 클러스터링 키를 반영하도록 합니다.

클러스터형 테이블에서 데이터를 읽습니다.

삭제 벡터 읽기를 지원하는 Delta Lake 클라이언트를 사용하여 클러스터형 테이블의 데이터를 읽을 수 있습니다. 최상의 쿼리 결과를 위해 다음 예제와 같이 쿼리 필터에 클러스터링 키를 포함합니다.

SELECT * FROM table_name WHERE cluster_key_column_name = "some_value";

클러스터링 키 변경

다음 예제와 같이 ALTER TABLE 명령을 실행하여 언제든지 테이블의 클러스터링 키를 변경할 수 있습니다.

ALTER TABLE table_name CLUSTER BY (new_column1, new_column2);

클러스터링 키를 변경하는 경우 후속 OPTIMIZE 및 쓰기 작업은 새 클러스터링 방법을 사용하지만 기존 데이터는 다시 작성되지 않습니다.

다음 예제와 같이 키를 설정하여 클러스터링을 해제할 NONE수도 있습니다.

ALTER TABLE table_name CLUSTER BY NONE;

클러스터 키를 설정해 NONE 도 이미 클러스터된 데이터는 다시 작성되지 않지만 향후 OPTIMIZE 작업에서 클러스터링 키를 사용할 수 없습니다.

테이블이 클러스터되는 방법 보기

다음 예제와 같이 DESCRIBE 명령을 사용하여 테이블에 대한 클러스터링 키를 볼 수 있습니다.

DESCRIBE TABLE table_name;

DESCRIBE DETAIL table_name;

액체 클러스터링이 있는 테이블에 대한 호환성

Databricks Runtime 14.1 이상에서 Liquid 클러스터링을 사용하여 만든 테이블은 기본적으로 v2 검사점을 사용합니다. Databricks Runtime 13.3 LTS 이상에서 v2 검사점을 사용하여 테이블을 읽고 쓸 수 있습니다.

Databricks Runtime 12.2 LTS 이상에서 액체 클러스터링이 있는 테이블을 읽으려면 v2 검사점을 사용하지 않도록 설정하고 테이블 프로토콜을 다운그레이드할 수 있습니다. 드롭 델타 테이블 기능을 참조하세요.

제한 사항

다음 제한 사항이 존재합니다.

  • Databricks Runtime 15.1 이하에서는 쓰기 시 클러스터링이 필터, 조인 또는 집계를 포함하는 원본 쿼리를 지원하지 않습니다.
  • 구조적 스트리밍 워크로드는 쓰기 시 클러스터링을 지원하지 않습니다.
  • Databricks Runtime 15.4 LTS 이하에서는 구조적 스트리밍 쓰기를 사용하여 액체 클러스터링을 사용하도록 설정된 테이블을 만들 수 없습니다. 구조적 스트리밍을 사용하여 액체 클러스터링을 사용하도록 설정된 기존 테이블에 데이터를 쓸 수 있습니다.