V-Order를 사용하여 Delta Lake 테이블 최적화

LakehouseDelta Lake 테이블 형식은 Microsoft Fabric 중심입니다. 델타 테이블을 최적화된 상태로 유지하는 것은 분석 워크로드의 성능 및 비용 효율성의 핵심입니다.

이 문서에서는 V-Order를 사용할 시기를 결정하고 델타 테이블의 기본 구성 및 유지 관리 패턴을 보여 줍니다.

이 문서의 사용 용도:

  • V-Order의 변경 내용과 도움이 되는 시기를 이해합니다.
  • Z-Order와 V-Order가 서로를 어떻게 보완하는지 이해합니다.
  • 올바른 컨트롤 수준(세션, 테이블 속성 또는 쓰기 작업)을 선택합니다.
  • 올바른 Spark 런타임 컨텍스트에서 델타 테이블 유지 관리 패턴을 적용합니다.

사용 시나리오에 따라 V-Order를 적용하는 시기에 대한 워크로드 간 지침은 워크로드 간 테이블 유지 관리 및 최적화를 참조하세요.

V-Order란?

V-Order는 패브릭 엔진에서 다운스트림 쿼리 성능을 향상시킬 수 있는 Parquet 파일에 대한 쓰기 시간 최적화입니다.

한눈에 보기:

  • 가장 도움이 되는 위치: 대시보드, 대화형 분석 및 반복 검색과 같은 읽기가 많은 패턴입니다.
  • 도움이 되는 방법: Parquet 레이아웃(예: 행 그룹 배포, 인코딩 및 압축)을 재구성하여 읽기 효율성을 개선합니다.
  • 일반적인 절충: 쓰기는 더 오래 걸릴 수 있지만(평균 약 15%), 읽기는 워크로드에 따라 크게 향상될 수 있습니다.
  • 엔진 호환성: 파일은 오픈 소스 Parquet 규격으로 유지되며 Z-Order와 같은 델타 기능은 호환됩니다.
  • 범위: V-Order는 파일 수준입니다. 압축, 진공 및 시간 이동과 같은 델타 작업을 함께 사용할 수 있습니다.

V-Order 쓰기 작업 제어

V-Order는 특히 읽기가 많은 시나리오에서 더 빠른 쿼리 성능을 위해 Parquet 파일 레이아웃을 최적화하는 데 사용됩니다. Microsoft Fabric에서 새로 만든 모든 작업 영역에서는 쓰기가 많은 데이터 엔지니어링 워크로드의 성능을 최적화하기 위해 V-Order는 기본적으로 비활성화됩니다.

Apache Spark의 V-Order 동작은 다음 구성을 통해 제어됩니다.

구성 기본값 설명
spark.sql.parquet.vorder.default false 세션 수준 V-Order 쓰기를 제어합니다. 기본적으로 false로 설정되며, 새 패브릭 작업 영역에서 그렇게 됩니다.
TBLPROPERTIES("delta.parquet.vorder.enabled") 해제 테이블 수준에서 기본 V 순서 동작을 제어합니다.
DataFrame 작성기 옵션: parquet.vorder.enabled 해제 쓰기 작업 수준에서 V 순서를 제어하는 데 사용됩니다.

다음 명령을 사용하여 시나리오에 맞게 V-Order 쓰기를 활성화하거나 무시합니다.

새 Fabric 작업 영역(spark.sql.parquet.vorder.default=false)에서는 수집 및 변환 파이프라인의 쓰기 성능을 향상시키기 위해 기본적으로 V-Order가 비활성화되어 있습니다.

읽기 중심 워크로드, 즉 대화형 쿼리나 대시보드의 경우, spark.sql.parquet.vorder.defaulttrue로 설정하여 V-Order를 활성화합니다. 읽기 중심 성능을 위해 readHeavyforSpark V-Order를 자동으로 사용하도록 설정하는 리소스 프로필로 전환하거나 ReadHeavy 리소스 프로필을 전환할 수도 있습니다.

Fabric 런타임 1.3 이상에서는 설정이 spark.sql.parquet.vorder.enable 제거됩니다. 델타 최적화 중에 V 순서를 OPTIMIZE자동으로 적용할 수 있으므로 이 이전 설정이 필요하지 않습니다. 이전 런타임 버전에서 마이그레이션하는 경우 코드에서 이 설정을 제거합니다.

Apache Spark 세션에서 V-Order 구성 확인

이러한 명령을 사용하여 변경하기 전에 현재 세션 값을 확인합니다.

%%sql 
SET spark.sql.parquet.vorder.default 

Apache Spark 세션에서 V-Order 쓰기 사용 안 함

워크로드가 쓰기가 많고 더 빠른 수집 또는 변환 쓰기를 원하는 경우 이러한 명령을 사용합니다.

%%sql 
SET spark.sql.parquet.vorder.default=FALSE 

Apache Spark 세션에서 V-Order 쓰기 사용

세션 수준에서 V-Order를 사용하도록 설정하면, 해당 세션의 모든 Parquet 쓰기는 명시적으로 parquet.vorder.enabledfalse로 설정된 경우라도 V-Order를 사용합니다. 여기에는 델타 테이블과 비델타 Parquet 테이블 모두가 포함됩니다.

%%sql 
SET spark.sql.parquet.vorder.default=TRUE 

델타 테이블 속성을 사용하여 V-Order 제어

이 섹션에서는 테이블 속성이 SQL DDL 및 ALTER TABLE 문을 통해 정의되기 때문에 Spark SQL을 사용합니다.

세션에 적용되는 테이블 수준 기본값을 원하는 경우 테이블 속성을 사용합니다.

테이블을 만드는 동안 V-Order 테이블 속성을 사용하도록 설정합니다.

%%sql 
CREATE TABLE person (id INT, name STRING, age INT) USING parquet TBLPROPERTIES("delta.parquet.vorder.enabled" = "true");

테이블 속성이 true, INSERT, UPDATE, MERGE로 설정된 경우 쓰기 시간에 V-Order를 적용합니다. 세션 수준 및 쓰기 수준 설정이 여전히 우선하므로 쓰기는 V-Order를 사용하도록 설정된 TBLPROPERTIES경우에도 false 계속 사용할 수 있습니다.

테이블 속성을 변경하여 V-Order를 사용하거나 사용하지 않도록 설정합니다.

%%sql 
ALTER TABLE person SET TBLPROPERTIES("delta.parquet.vorder.enabled" = "true");

ALTER TABLE person SET TBLPROPERTIES("delta.parquet.vorder.enabled" = "false");

ALTER TABLE person UNSET TBLPROPERTIES("delta.parquet.vorder.enabled");

테이블 속성을 사용하여 V-Order를 사용하거나 사용하지 않도록 설정하면 테이블에 대한 이후 쓰기만 영향을 받습니다. Parquet 파일은 만들 때 사용된 순서를 유지합니다. V-Order를 적용하거나 제거하도록 현재 물리적 구조를 변경하려면 테이블 압축을 읽습니다.

쓰기 작업에서 직접 V-Order 제어

이 섹션에서는 PySpark를 사용하여 DataFrame 기록기 API를 보여 줍니다. 동일한 옵션을 사용하여 Scala DataFrame API에서 동일한 패턴을 사용할 수 있습니다.

세션 전체 또는 테이블 전체 기본값 대신 작업별 컨트롤이 필요한 경우 쓰기 수준 옵션을 사용합니다.

모든 Apache Spark 쓰기 명령은 명시적으로 재정의되지 않은 경우 세션 설정을 상속합니다. 다음 예제에서는 세션 구성을 상속하여 V-Order를 사용하여 씁니다.

df_source.write\
  .format("delta")\
  .mode("append")\
  .saveAsTable("myschema.mytable")

DeltaTable.createOrReplace(spark)\
  .addColumn("id","INT")\
  .addColumn("firstName","STRING")\
  .addColumn("middleName","STRING")\
  .addColumn("lastName","STRING",comment="surname")\
  .addColumn("birthDate","TIMESTAMP")\
  .location("Files/people")\
  .execute()

df_source.write\
  .format("delta")\
  .mode("overwrite")\
  .option("replaceWhere","start_date >= '2025-01-01' AND end_date <= '2025-01-31'")\
  .saveAsTable("myschema.mytable") 

V-Order는 조건자의 영향을 받는 파일에만 적용됩니다.

spark.sql.parquet.vorder.default가 설정되지 않았거나 false로 설정된 세션에서, 다음 명령은 V-Order를 사용하여 기록합니다.

df_source.write\
  .format("delta")\
  .mode("overwrite")\
  .option("replaceWhere","start_date >= '2025-01-01' AND end_date <= '2025-01-31'")\
  .option("parquet.vorder.enabled","true")\
  .saveAsTable("myschema.mytable")

DeltaTable.createOrReplace(spark)\
  .addColumn("id","INT")\
  .addColumn("firstName","STRING")\
  .addColumn("middleName","STRING")\
  .addColumn("lastName","STRING",comment="surname")\
  .addColumn("birthDate","TIMESTAMP")\
  .option("parquet.vorder.enabled","true")\
  .location("Files/people")\
  .execute()