델타 테이블에서 낮은 순서 섞기 병합 최적화
Delta Lake MERGE 명령을 사용하면 사용자가 고급 조건으로 델타 테이블을 업데이트할 수 있습니다. MERGE 명령을 사용하여 원본 테이블, 뷰 또는 DataFrame의 데이터를 대상 테이블로 업데이트할 수 있습니다. 그러나 현재 알고리즘은 수정되지 않은 행을 처리하는 데 완전히 최적화되어 있지 않습니다. 낮은 순서 섞기 병합 최적화를 사용하면 수정되지 않은 행은 일치하는 행을 업데이트하는 데 필요한 비용이 많이 드는 순서 섞기 작업에서 제외됩니다.
낮은 순서 섞기 병합이 필요한 이유
현재 병합 작업은 두 개의 조인 실행으로 수행됩니다. 첫 번째 조인은 전체 대상 테이블과 원본 데이터를 사용하여 일치하는 행을 포함하여 대상 테이블의 터치된 파일 목록을 찾는 것입니다. 그런 다음 실제 테이블 업데이트를 수행하기 위해 해당 터치된 파일과 원본 데이터만 읽는 두 번째 조인을 수행합니다. 첫 번째 조인이 두 번째 조인을 위한 데이터 양을 줄이기 위한 것이지만 터치된 파일에는 여전히 수정되지 않은 행이 엄청나게 많이 있을 수 있습니다. 첫 번째 조인 쿼리는 지정된 일치 조건의 열만 읽기 때문에 더 가볍습니다. 테이블 업데이트를 위한 두 번째 작업은 모든 열을 로드해야 하므로 비용이 많이 드는 순서 섞기 프로세스가 발생합니다.
낮은 순서 섞기 병합 최적화를 통해 델타는 첫 번째 조인에서 일치하는 행 결과를 일시적으로 유지하고 이를 두 번째 조인에 활용합니다. 결과에 따라 대규모 순서 섞기 프로세스에서 수정되지 않은 행을 제외합니다. 일치하는 행과 수정되지 않은 행에 대해 별도의 두 가지 쓰기 작업이 있으므로 이전 동작에 비해 출력 파일 수가 2배가 될 수 있습니다. 그러나 예상되는 성능 향상은 가능한 작은 파일 문제보다 더 큽니다.
가용성
참고 항목
- 낮은 순서 섞기 병합은 미리 보기 기능으로 사용할 수 있습니다.
Apache Spark 버전 3.2 및 3.3용 Synapse 풀에서 사용할 수 있습니다.
버전 | 가용성 | 기본값 |
---|---|---|
Delta 0.6 / Spark 2.4 | 아니요 | - |
Delta 1.2 / Spark 3.2 | 예 | false |
Delta 2.2 / Spark 3.3 | 예 | true |
낮은 순서 섞기 병합의 이점
- 터치된 파일의 수정되지 않은 행은 별도로 처리되며 실제 병합 작업을 거치지 않습니다. 전체 병합 실행 시간과 컴퓨팅 리소스를 절약할 수 있습니다. 많은 행을 복사하고 몇 개의 행만 업데이트하면 이득이 더 커집니다.
- 수정되지 않은 행에 대해서는 행 순서가 유지됩니다. 따라서 파일이 정렬되었거나 Z-ORDERED된 경우 수정되지 않은 행의 출력 파일은 데이터 건너뛰기에 여전히 효율적일 수 있습니다.
- 병합 조건이 터치된 파일의 모든 행과 일치하는 최악의 경우에도 약간의 오버헤드가 있습니다.
낮은 순서 섞기 병합을 사용 및 사용하지 않도록 설정하는 방법
풀 또는 세션에 대해 구성이 설정된 다음, 모든 Spark 쓰기 패턴에 이 기능이 사용됩니다.
낮은 순서 섞기 병합 최적화를 사용하려면 다음 구성을 사용하여 사용하도록 설정합니다.
- Scala 및 PySpark
spark.conf.set("spark.microsoft.delta.merge.lowShuffle.enabled", "true")
- Spark SQL
SET `spark.microsoft.delta.merge.lowShuffle.enabled` = true
현재 구성 값을 확인하려면 아래 표시된 대로 명령을 사용합니다.
- Scala 및 PySpark
spark.conf.get("spark.microsoft.delta.merge.lowShuffle.enabled")
- Spark SQL
SET `spark.microsoft.delta.merge.lowShuffle.enabled`
기능을 사용하지 않도록 설정하려면 아래와 같이 다음 구성을 변경합니다.
- Scala 및 PySpark
spark.conf.set("spark.microsoft.delta.merge.lowShuffle.enabled", "false")
- Spark SQL
SET `spark.microsoft.delta.merge.lowShuffle.enabled` = false