다음을 통해 공유


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

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

V-Order란?

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

Power BI 및 SQL 엔진은 Microsoft Verti-Scan 기술 및 V-Order parquet 파일을 사용하여 데이터 액세스 시간과 같은 메모리 내 항목을 달성합니다. Spark 및 Verti-Scan 이외 다른 컴퓨팅 엔진은 읽기 시간이 평균 10% 빠른 V-Order 파일의 이점을 활용하며, 경우에 따라서는 읽기 시간이 최대 50%까지 빠릅니다.

V-Order는 parquet 파일에 특수 정렬, 행 그룹 배포, 사전 인코딩 및 압축을 적용하여 작동하므로 이 파일을 읽는데 필요한 네트워크, 디스크, 컴퓨팅 엔진의 CPU 리소스가 적어 비용 효율성과 성능이 뛰어납니다. V-Order 정렬은 평균 쓰기 시간을 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-Order 모드
DataFrame Writer 옵션: parquet.vorder.enabled 설정 해제 DataFrame Writer를 사용하여 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.vorder.enabled 테이블 속성이 true 또는 false로 설정된 델타가 아닌 parquet 테이블 및 델타 테이블이 포함됩니다.

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

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

테이블을 만드는 동안 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-Order 제어" 섹션을 참조하세요.

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

명시적이지 않은 경우 모든 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-Order는 조건자의 영향을 받는 파일에만 적용됩니다.

spark.sql.parquet.vorder.enabled이 설정 해제 되었거나 false로 설정된 세션에서 다음 명령은 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 작업자 수, 해당 구성 사이의 관계는 성능에 대해 중요한 역할을 수행합니다. 데이터 레이크 테이블로 데이터를 수집하면 많은 작은 파일을 지속적으로 작성하는 상속된 특성을 가질 수 있습니다. 이 시나리오는 일반적으로 “작은 파일 문제”로 알려져 있습니다.

쓰기 최적화는 Microsoft Fabric에서 델타 레이크로, 작성되는 파일 수를 줄여 작성되는 데이터의 개별 파일 크기를 늘리는 것을 목표로 하는 Apache Spark 엔진의 Azure Synapse Analytics 기능입니다. 대상 파일 크기는 구성을 사용하여 워크로드 요구 사항에 따라 변경될 수 있습니다.

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

병합 최적화

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

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

델타 테이블 유지 관리

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

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

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

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

Important

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

테이블을 최적화할 때 V-Order 제어

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

%%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 압축 후 다시 작성합니다. 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, ...)];