데이터를 검색하거나 쿼리할 때 불필요한 데이터를 효과적으로 건너뛰어 성능을 향상시키는 기술이다.
Data skipping은 Data Pruning을 가능하게 하는 메커니즘 중 하나이다. 데이터베이스나 데이터 웨어하우스에서 쿼리 성능을 향상시키기 위해 사용되는 기술로, 쿼리가 처리해야 할 데이터의 양을 줄임으로써 불필요한 데이터 읽기를 최소화한다.
Metadata Collection 이 자동으로 발생한다.
Data skipping information is automatically collected when data is written into a Delta table.
이를 통해, Target Ranges 를 가질 수 있다.
Delta Lake on Databricks 의 핵심 기능 중 하나인 Data Skipping은 쿼리 성능 최적화를 위해 Metadata를 활용한다. 이는 Delta Lake의 효율적인 데이터 관리를 가능하게 하는 중요한 요소이다.
수집된 Medtadata는 Delta Lake on Databricks 에서 쿼리 속도를 높이기 위해 최소값과 최대값을 사용하여 대상 범위를 설정할 수 있게 한다. 최소값과 최대값은 메타데이터의 일부이다.
사용자가 쿼리를 실행할 때, Delta Lake는 해당 쿼리에 필요한 데이터의 범위를 분석한다. 이때 최소 및 최대값 정보를 활용하여 불필요한 파일 또는 파티션을 건너뛰게 된다.
이 모든 것은 Data Layout 에 따라 달라진다.
For best Results, Z-Ordering should be used.
Delta Table
Delta Lake에서 사용되는 테이블의 형태로 Delta Lake의 핵심 구성 요소 중 하나입니다.
Delta Lake
Apache Spark 기반의 데이터 레이크 관리 기술 로서, Apache Spark와 데이터 레이크의 개념을 기반으로 하여, 데이터 레이크에서 대규모 데이터를 관리하면서 데이터의 신뢰성, 일관성, 확장성을 보장하는 플랫폼입니다. 대용량의 데이터를 효과적으로 저장, 관리, 처리하기 위한 기능을 제공합니다.
Delta Lake는 Parquet 형식을 기반으로 하며, Apache Spark의 기능과 연동하여 대규모 데이터셋을 효과적으로 처리할 수 있도록 지원합니다.
따라서, Delta Lake는 Apache Spark 기반에서 데이터 레이크의 기능을 보완하고, 데이터 레이크에서 안정적이고 신뢰성 있는 대용량 데이터 관리를 가능케 하는 기술입니다.
Apache Spark
분산 컴퓨팅 프레임워크로, 대규모 데이터셋을 효과적으로 처리하는 데 사용됩니다.
Databricks
Databricks는 Apache Spark 기반의 통합 분석 플랫폼을 제공하는 회사입니다. Databricks 플랫폼은 데이터 과학, 데이터 엔지니어링, 머신러닝 등 다양한 빅데이터 분석 작업을 지원합니다.
Delta Lake는 Databricks에서 적극적으로 지원하고 발전시키는 프로젝트 중 하나이며, Databricks는 Delta Lake의 기능을 활용하여 데이터 처리 및 분석 작업의 성능을 최적화합니다. Databricks 사용자는 Delta Lake의 Data Skipping 기능을 통해 쿼리 성능을 향상시킬 수 있습니다.
데이터 레이크
대량의 정형 및 비정형 데이터를 안정적으로 저장하고 관리하는 데이터 저장소입니다.
Z-Ordering은 data skipping을 위한 데이터 레이아웃 기술 중 하나로 관련된 정보를 동일한 파일 집합에 공존시키는 기술이다.
데이터 레이아웃 : 데이터가 물리적 저장소에 어떻게 배치되는지를 정의하는 것으로 데이터의 저장방식을 의미한다. '열 기반 레이아웃'과 '행 기반 레이아웃'이 있으며, Z-Ordering 같은 기반을 통해 다차원 데이터를 효율적으로 저장하고 검색할 수 있는 '공간적 레아아웃' 방식도 있다.
다차원 데이터를 하나의 차원으로 매핑 (예. 두 차원의 좌표 (x, y)가 있을 때, x와 y의 비트를 교차시켜 하나의 Z-숫자를 생성) 하면서 데이터의 국소성(locality) 을 유지하는 방식이다.
이를 통해 관련 데이터를 물리적으로 서로 가까이 저장할 수 있어, 쿼리가 특정 조건에 해당하는 데이터를 찾을 때 더 적은 양의 데이터를 스캔하면서 원하는 결과를 빠르게 얻을 수 있다.
데이터 국소성이란,
비슷한 다차원의 값들을 가까이 배치하도록 해, 쿼리가 특정 범위의 데이터를 검색할 때 스캔해야 할 데이터의 양을 줄일 수 있다.
Delta Lake on Databricks의 data-skipping 알고리즘에서는 자동으로 사용되어 읽어야 하는 데이터의 양을 상당히 줄인다.
DFP, Dynamic File Pruning은 Delta Lake에서 사용되는 최적화 기법으로, 조인 작업에서 필요한 파일만을 읽어오도록 한다. 데이터의 분포나 특성에 따라 일부 파일 또는 블록을 스킵함으로써 쿼리의 처리 속도를 높힌다.
Can Dramatically Improve Query Performance
파티션 내에서 파일을 건너뛰도록 혀용하기 때문에 쿼리 성능이 크게 향상될 수 있다.
Performance Impact Correlated to Clustering
Relies on pre-sorted data, such as Z-Ordering clustering.
(Z-Ordering 클러스터링과 같이 미리 정렬된 데이터에 의존한다.)
DFP에서 클러스터링이 중요한 이유는, 데이터가 클러스터링되어 있지 않으면, 쿼리 최적화 기술이 효과적으로 작동하기 어렵기 때문이다.
예를 들어, 데이터가 임의로 분산되어 있다면, 쿼리 조건과 일치하는 데이터를 찾기 위해 전체를 스캔해야 할 수 있다. 반면, Z-Ordering과 같은 클러스터링 기법을 사용하면, 쿼리 처리 엔진이 데이터의 물리적 배치를 이해하고, 불필요한 데이터 블록을 효과적으로 스킵할 수 있다.
여기서 말하는 "클러스터링"은 데이터를 물리적으로 특정 기준에 따라 그룹화하는 것을 의미한다.
클러스터링을 통해 관련 데이터를 함께 저장함으로써, 쿼리 실행 시 필요한 데이터를 보다 빠르게 찾을 수 있으며, 불필요한 데이터 스캔을 최소화할 수 있다. 이는 디스크I/O 작업을 줄여 성능을 개선하는 데 도움이 된다.
Hero of the Non-partitioned
DFP is especially efficient for non-partitioned tables, or for joins of non-partitioned columns.
spark.databricks.optimizer.dynamicPartitionPruning
(Default : True)
이는 켜거나 끄는 최상위 설정이다.
이 옵션을 켜면 동적 파티션 프루닝이 사용되며, 꺼지면 해당 최적화가 비활성화된다. 동적 파티션 프루닝은 쿼리 실행 중에 필요한 파티션만을 스캔하여 데이터를 읽도록 하는 최적화 기능이다.
spark.databricks.optimizer.deltaSizeThreshold
(Default : 10 GB)
DFP를 활성화하기 위해 조인의 프로브 측(조인되는 테이블) 에 필요한 델타 테이블의 최소 크기를 나타낸다. 만약, 프로브 측이 매우 크지 않다면 전체 테이블을 스캔하는 것이 더 나을 수도 있다.
빌더(Driving) 테이블: 조인의 기준이 되는 테이블로, 이 테이블의 데이터가 조인 시 기준이 되어 다른 테이블과 매칭됩니다.
프로브(Probe) 테이블: 빌더 테이블과 조인되는 테이블로, 이 테이블의 데이터를 가져와서 빌더 테이블과 매칭시킵니다.
spark.databricks.optimizer.deltaTableFilesThreshold
(Default : 10 (Databricks 런타임 8.4 이상))
DFP를 활성화하기 위해 조인의 프로브(조인되는 테이블) 측에 있는 델타 테이블의 파일 수를 나타낸다. 프로브 측 테이블의 파일 수는 DFP가 활성화되기 위해 프로브 테이블이 가져와야 하는 최소 파일 수를 나타낸다.
프로브 측 테이블의 파일 수가 임계값보다 적을 경우 DFP가 활성화되지 않는다. 따라서, spark.databricks.optimizer.deltaTableFilesThreshold
가 10으로 설정되어 있다면, 프로브 테이블이 가져와야 하는 파일 수가 10 이하일 때 DFP가 활성화되지 않는다. 이렇게 설정하는 이유는 DFP를 적용하는 데에는 일정 수준 이상의 파일이 있어야 효과적으로 최적화를 수행할 수 있기 때문이다.
Delta Lake on Databricks 는 data skipping 을 지원하기 위해 metadata 를 활용한다.
Z-Ordering을 사용하여 관련 정보를 동일한 파일 세트에 함께 배치하고, 데이터를 사전 정렬한 후
Dynamic File Pruning 은 이러한 기술들을 활용하여 파티션 내에서 필터에 기반하여 파일을 건너 뛰게 된다.
Delta Lake on Databricks에서 "파티션 내에서 필터에 기반하여 파일을 건너뛰는" 것은,
쿼리 실행 시 쿼리의 조건과 일치하지 않는 데이터를 포함하는 파일들을 식별하여 이들 파일을 읽지 않고 건너뛰는 과정을 의미한다. 이 과정은 Dynamic File Pruning (동적 파일 가지치기)으로 알려져 있으며, 데이터 스킵핑의 한 형태이다. 여기서 "파티션 내"라는 표현은 데이터가 저장될 때 물리적으로 분할되어 저장되는 구조 내에서 이루어지는 작업을 가리킨다.