Share via


Delta Lake 테이블 최적화 및 V-Order

LakehouseDelta Lake 테이블 형식은 Microsoft Fabric의 핵심이며, 분석에 최적화된 테이블이 주요 요구 사항임을 확인합니다. 이 가이드에서는 Delta Lake 테이블 최적화 개념, 구성 및 이를 가장 일반적인 빅 데이터 사용 패턴에 적용하는 방법을 설명합니다.

V-Order란?

V-Order는 Power BI, SQL, Spark 등과 같은 Microsoft Fabric 컴퓨팅 엔진에서 빠른 읽기를 가능하게 하는 parquet 파일 형식 에 대한 쓰기 시간 최적화입니다.

Power BI 및 SQL 엔진은 Microsoft Verti-Scan 기술 및 V-Ordered parquet 파일을 사용하여 데이터 액세스 시간과 같은 메모리 내를 달성합니다. Spark 및 기타 비 Verti-Scan 컴퓨팅 엔진은 평균 10% 빠른 읽기 시간을 가진 V 정렬 파일의 이점을 활용하며, 일부 시나리오는 최대 50%까지 지원됩니다.

V-Order는 parquet 파일에 특수 정렬, 행 그룹 배포, 사전 인코딩 및 압축을 적용하여 작동하므로 컴퓨팅 엔진의 네트워크, 디스크 및 CPU 리소스를 덜 읽고 비용 효율성과 성능을 제공합니다. V 순서 정렬은 평균 쓰기 시간에 15%의 영향을 주지만 최대 50% 더 많은 압축을 제공합니다.

100% 오픈 소스 parquet 형식을 준수합니다. 모든 parquet 엔진은 이를 일반 parquet 파일로 읽을 수 있습니다. 델타 테이블은 그 어느 때보다 효율적입니다. Z-Order와 같은 기능은 V-Order와 호환됩니다. 테이블 속성 및 최적화 명령은 해당 파티션의 제어 V-Order에서 사용할 수 있습니다.

V 순서는 parquet 파일 수준에서 적용됩니다. 델타 테이블 및 해당 기능(예: Z-Order, 압축, 진공, 시간 이동 등)은 V-Order에 직교되며 호환되며 추가적인 이점을 위해 함께 사용할 수 있습니다.

V-Order 쓰기 제어

V-Order는 Microsoft Fabric에서 기본적으로 사용하도록 설정되며 Apache Spark에서는 다음 구성으로 제어됩니다.

구성 기본값 설명
spark.sql.parquet.vorder.enabled true 세션 수준 V-Order 쓰기를 제어합니다.
TBLPROPERTIES("delta.parquet.vorder.enabled") false 테이블의 기본 V 순서 모드
데이터 프레임 작성기 옵션: parquet.vorder.enabled 해제 데이터 프레임 작성기를 사용하여 V-Order 쓰기 제어

다음 명령을 사용하여 V-Order 쓰기의 사용을 제어합니다.

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

%%sql 
SET spark.sql.parquet.vorder.enabled 

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

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

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

Important

세션 수준에서 사용하도록 설정된 경우 모든 parquet 쓰기는 V-Order를 사용하도록 설정하여 작성됩니다. 여기에는 델타가 아닌 parquet 테이블과 테이블 속성이 parquet.vorder.enabled 둘 중 하나 true 또는 false로 설정된 델타 테이블이 포함됩니다.

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

델타 테이블 속성을 사용하여 V 순서 제어

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

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

Important

테이블 속성이 true로 설정되면 INSERT, UPDATE 및 MERGE 명령이 예상대로 동작하고 쓰기 시간 최적화를 수행합니다. V-Order 세션 구성이 true로 설정되거나 spark.write에서 사용하도록 설정하는 경우 TBLPROPERTIES가 false로 설정된 경우에도 쓰기가 V-Order가 됩니다.

테이블 속성을 변경하여 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 순서 제어" 섹션을 참조하세요.

쓰기 작업에서 직접 V 순서 제어

명시적이지 않은 경우 모든 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 >= '2017-01-01' AND end_date <= '2017-01-31'")\
  .saveAsTable("myschema.mytable") 

Important

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

설정되지 않거나 false로 설정된 세션에서 spark.sql.parquet.vorder.enabled 다음 명령은 V-Order를 사용하여 작성합니다.

df_source.write\
  .format("delta")\
  .mode("overwrite")\
  .option("replaceWhere","start_date >= '2017-01-01' AND end_date <= '2017-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()

쓰기 최적화란?

Apache Spark와 같은 빅 데이터 처리 엔진의 분석 워크로드는 표준화된 더 큰 파일 크기를 사용할 때 가장 효율적으로 수행됩니다. 파일 크기, 파일 수, Spark 작업자 수, 해당 구성 사이의 관계는 성능에 대해 중요한 역할을 수행합니다. 데이터 레이크 테이블에 데이터를 수집하면 많은 작은 파일을 지속적으로 작성하는 상속된 특성이 있을 수 있습니다. 이 시나리오는 일반적으로 "작은 파일 문제"라고 합니다.

쓰기 최적화는 Apache Spark 엔진의 Microsoft Fabric 및 Azure Synapse Analytics 기능의 Delta Lake로, 작성된 파일 수를 줄이고 기록된 데이터의 개별 파일 크기를 늘리는 것을 목표로 합니다. 구성을 사용하여 워크로드 요구 사항에 따라 대상 파일 크기를 변경할 수 있습니다.

이 기능은 Apache Spark용 Microsoft Fabric 런타임에서 기본적으로 사용하도록 설정됩니다. 쓰기 사용 시나리오 최적화에 대한 자세한 내용은 Apache Spark에서 쓰기 최적화의 필요성 문서를 참조하세요.

병합 최적화

Delta Lake MERGE 명령을 사용하면 사용자가 고급 조건으로 델타 테이블을 업데이트할 수 있습니다. MERGE 명령을 사용하여 원본 테이블, 뷰 또는 DataFrame의 데이터를 대상 테이블로 업데이트할 수 있습니다. 그러나 Delta Lake의 오픈 소스 배포에 있는 현재 알고리즘은 수정되지 않은 행을 처리하는 데 완전히 최적화되지 않았습니다. Microsoft Spark Delta 팀은 사용자 지정 낮은 순서 섞기 병합 최적화를 구현했으며, 수정되지 않은 행은 일치하는 행을 업데이트하는 데 필요한 비용이 많이 드는 순서 섞기 작업에서 제외됩니다.

구현은 구성에 spark.microsoft.delta.merge.lowShuffle.enabled 의해 제어되며 런 타임에서 기본적으로 사용하도록 설정됩니다. 코드를 변경할 필요가 없으며 Delta Lake의 오픈 소스 배포와 완벽하게 호환됩니다. 낮은 순서 섞기 병합 사용 시나리오에 대한 자세한 내용은 델타 테이블에서 낮은 순서 섞기 병합 최적화 문서를 참조하세요.

델타 테이블 기본 테넌트

델타 테이블이 변경되면 다음과 같은 이유로 성능 및 스토리지 비용 효율성이 저하되는 경향이 있습니다.

  • 테이블에 추가된 새 데이터는 데이터를 왜곡할 수 있습니다.
  • 일괄 처리 및 스트리밍 데이터 수집 속도는 많은 작은 파일을 가져올 수 있습니다.
  • 업데이트 및 삭제 작업은 결국 읽기 오버헤드를 만듭니다. parquet 파일은 디자인상 변경할 수 없으므로 델타 테이블은 변경 집합이 포함된 새 parquet 파일을 추가하여 처음 두 항목에 의해 부과된 문제를 더욱 증폭합니다.
  • 스토리지에서 사용할 수 있는 데이터 파일 및 로그 파일이 더 이상 필요하지 않습니다.

최상의 성능을 위해 테이블을 최상의 상태로 유지하려면 델타 테이블에서 bin 압축 및 진공 작업을 수행합니다. Bin 압축은 OPTIMIZE 명령을 통해 수행됩니다. 모든 변경 내용을 더 크고 통합된 parquet 파일로 병합합니다. dereferenced storage 클린-up은 VACUUM 명령에 의해 수행됩니다.

테이블 기본테넌스 명령 OPTIMIZEVACUUM은 Notebook 및 Spark 작업 정의 내에서 사용한 다음 플랫폼 기능을 사용하여 오케스트레이션할 수 있습니다. Fabric의 Lakehouse는 Delta Lake 테이블 기본 테넌트 문서에 설명된 대로 사용자 인터페이스를 사용하여 임시 테이블 기본 테넌트를 수행하는 기능을 제공합니다.

Important

수집 빈도 및 예상 읽기 패턴을 기반으로 테이블 물리적 구조를 올바르게 디자인하는 것이 이 섹션에 설명된 최적화 명령을 실행하는 것보다 더 중요할 수 있습니다.

테이블을 최적화할 때 V 순서 제어

다음 명령 구조는 TBLPROPERTIES 설정 또는 세션 구성 설정과 관계없이 V-Order를 사용하여 영향을 받는 모든 파일을 bin-compact 및 다시 작성합니다.

%%sql 
OPTIMIZE <table|fileOrFolderPath> VORDER;

OPTIMIZE <table|fileOrFolderPath> WHERE <predicate> VORDER;

OPTIMIZE <table|fileOrFolderPath> WHERE <predicate> [ZORDER  BY (col_name1, col_name2, ...)] VORDER;

ZORDER와 VORDER를 함께 사용하면 Apache Spark는 bin 압축, ZORDER, VORDER를 순차적으로 수행합니다.

다음 명령은 TBLPROPERTIES 설정을 사용하여 영향을 받는 모든 파일을 bin-compact 및 다시 작성합니다. TBLPROPERTIES가 V-Order로 true로 설정되면 영향을 받는 모든 파일이 V-Order로 작성됩니다. TBLPROPERTIES가 설정되지 않았거나 V-Order로 false로 설정된 경우 세션 설정을 상속합니다. 테이블에서 V-Order를 제거하려면 세션 구성을 false로 설정합니다.

%%sql 
OPTIMIZE <table|fileOrFolderPath>;

OPTIMIZE <table|fileOrFolderPath> WHERE predicate;

OPTIMIZE <table|fileOrFolderPath> WHERE predicate [ZORDER BY (col_name1, col_name2, ...)];