Apache Spark에 대한 쓰기 최적화 요구
Apache Spark와 같은 빅 데이터 처리 엔진의 분석 워크로드는 표준화된 더 큰 파일 크기를 사용할 때 가장 효율적으로 수행됩니다. 파일 크기, 파일 수, Spark 작업자 수, 해당 구성 사이의 관계는 성능에 대해 중요한 역할을 수행합니다. 데이터 레이크 테이블로 워크로드를 수집하면 많은 작은 파일을 지속적으로 작성하는 상속된 특성이 있을 수 있습니다. 이 시나리오는 일반적으로 "작은 파일 문제"라고 합니다.
쓰기 최적화는 작성되는 파일 수를 줄이고 작성되는 데이터의 개별 파일 크기를 늘리는 것을 목표로 하는 Synapse의 Delta Lake 기능입니다. 기본 128MB 크기의 파일을 생성하는 동안 파티션을 동적으로 최적화합니다. 구성을 사용하여 워크로드 요구 사항에 따라 대상 파일 크기가 변경될 수 있습니다.
이 기능은 파티션에 따라 추가 데이터 셔플 단계를 사용하여 파일 크기를 달성하므로, 데이터를 쓰는 동안 추가 처리 비용이 발생합니다. 작은 쓰기로 인한 페널티 보다 테이블에 대한 읽기 효율성이 더 커야 합니다.
참고 항목
- Apache Spark 버전 3.1 이상용 Synapse 풀에서 사용할 수 있습니다.
쓰기 최적화의 이점
- 일괄 처리 및 스트림이 쓰기 패턴 모두 Delta Lake 테이블에서 사용할 수 있습니다.
spark.write
명령 패턴을 변경할 필요가 없습니다. 이 기능은 구성 설정 또는 테이블 속성에 의해 사용하도록 설정됩니다.- OPTIMIZE 명령에 비해 쓰기 트랜잭션 수를 줄여 줍니다.
- OPTIMIZE 작업은 더 적은 파일로 작동하므로 더 빠릅니다.
- 이전에 참조되지 않은 파일을 삭제하기 위한 VACUUM 명령도 더 빠르게 작동합니다.
- 쿼리가 더 최적화된 파일 크기의 더 적은 수의 파일을 스캔하므로 읽기 성능 또는 리소스 사용량이 개선됩니다.
쓰기 최적화 사용 시나리오
사용 시기
- Delta Lake 분할된 테이블은 최적이 아닌(128MB 미만) 또는 비표준 파일 크기(자체 크기가 다른 파일)를 생성하는 쓰기 패턴이 적용됩니다.
- 다시 파티션을 나눈 데이터 프레임이 최적이 아닌 파일 크기의 디스크에 작성됩니다.
- Delta Lake 파티션 분할된 테이블이 UPDATE, DELETE, MERGE, CREATE TABLE AS SELECT, INSERT INTO 등의 작은 일괄 처리 SQL 명령의 대상이 됩니다.
- 추가 쓰기 대기 시간이 허용될 수 있는 Delta Lake 파티션 분할된 테이블에 추가 데이터 패턴을 사용하여 수집 시나리오를 스트리밍합니다.
피해야 하는 경우
- 파티션 분할된 테이블이 없습니다.
- 추가 쓰기 대기 시간이 허용되지 않는 사용 사례입니다.
- 잘 정의된 최적화 일정 및 읽기 패턴을 사용하는 대규모 테이블입니다.
쓰기 최적화 기능을 사용 및 사용하지 않도록 설정하는 방법
쓰기 최적화 기능은 기본적으로 사용하지 않도록 설정됩니다. Spark 3.3 풀에서는 분할된 테이블에 대해 기본적으로 사용하도록 설정됩니다.
풀 또는 세션에 대해 구성이 설정된 다음, 모든 Spark 쓰기 패턴에 이 기능이 사용됩니다.
쓰기 최적화 기능을 사용하려면 다음 구성을 사용하여 사용하도록 설정합니다.
- Scala 및 PySpark
spark.conf.set("spark.microsoft.delta.optimizeWrite.enabled", "true")
- Spark SQL
SET `spark.microsoft.delta.optimizeWrite.enabled` = true
현재 구성 값을 확인하려면 다음과 같이 명령을 사용합니다.
- Scala 및 PySpark
spark.conf.get("spark.microsoft.delta.optimizeWrite.enabled")
- Spark SQL
SET `spark.microsoft.delta.optimizeWrite.enabled`
쓰기 최적화 기능을 사용하지 않도록 설정하려면 다음과 같이 다음 구성을 변경합니다.
- Scala 및 PySpark
spark.conf.set("spark.microsoft.delta.optimizeWrite.enabled", "false")
- Spark SQL
SET `spark.microsoft.delta.optimizeWrite.enabled` = false
테이블 속성을 사용하여 쓰기 최적화 제어
새로운 테이블 사용
- SQL
CREATE TABLE <table_name> TBLPROPERTIES (delta.autoOptimize.optimizeWrite = true)
- Scala
val table = DeltaTable.create()
.tableName("<table_name>")
.addColumnn("<colName>", <dataType>)
.location("<table_location>")
.property("delta.autoOptimize.optimizeWrite", "true")
.execute()
기존 테이블 사용
- SQL
ALTER TABLE <table_name> SET TBLPROPERTIES (delta.autoOptimize.optimizeWrite = true)
- Scala
val table = DeltaTable.replace()
.tableName("<table_name>")
.location("<table_location>")
.property("delta.autoOptimize.optimizeWrite", "true")
.execute()
쓰기 최적화에 대한 현재 최대 파일 크기 구성을 가져오는 방법
현재 구성 값을 가져오려면 아래 명령을 사용합니다. 기본값은 128MB입니다.
- Scala 및 PySpark
spark.conf.get("spark.microsoft.delta.optimizeWrite.binSize")
- SQL
SET `spark.microsoft.delta.optimizeWrite.binSize`
- 구성 값을 변경하려면
- Scala 및 PySpark
spark.conf.set("spark.microsoft.delta.optimizeWrite.binSize", "134217728")
- SQL
SET `spark.microsoft.delta.optimizeWrite.binSize` = 134217728