쓰기 성능 최적화 - AWS 규범적 지침

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

쓰기 성능 최적화

이 섹션에서는 엔진과 관계없이 Iceberg 테이블의 쓰기 성능을 최적화하기 위해 조정할 수 있는 테이블 속성에 대해 설명합니다.

테이블 배포 모드를 설정하세요.

Iceberg는 쓰기 데이터가 Spark 태스크에 분산되는 방식을 정의하는 다양한 쓰기 분산 모드를 제공합니다. 사용 가능한 모드에 대한 개요는 Iceberg 설명서의 쓰기 분산 모드를 참조하십시오.

특히 스트리밍 워크로드에서 쓰기 속도를 우선시하는 사용 사례의 경우 로 설정하십시오. write.distribution-mode none 이렇게 하면 Iceberg에서 추가 Spark 셔플링을 요청하지 않고 Spark 태스크에서 사용할 수 있게 되는 대로 데이터가 기록됩니다. 이 모드는 Spark 구조적 스트리밍 애플리케이션에 특히 적합합니다.

참고

쓰기 분산 모드를 로 설정하면 작은 파일이 많이 생성되어 읽기 성능이 저하되는 none 경향이 있습니다. 쿼리 성능을 위해 이러한 작은 파일을 적절한 크기의 파일로 통합하려면 정기적으로 압축하는 것이 좋습니다.

적절한 업데이트 전략을 선택하세요.

사용 사례에 따라 최신 데이터에 대한 느린 읽기 작업이 허용되는 경우 merge-on-read 전략을 사용하여 쓰기 성능을 최적화하십시오.

를 사용하면 merge-on-read Iceberg는 업데이트와 삭제를 별도의 작은 파일로 스토리지에 기록합니다. 테이블을 읽을 때 독자는 이러한 변경 내용을 기본 파일에 병합하여 데이터의 최신 보기를 반환해야 합니다. 이로 인해 읽기 작업의 성능이 저하되지만 업데이트 및 삭제 쓰기 속도는 빨라집니다. 일반적으로 업데이트가 있는 워크로드 또는 업데이트가 거의 없는 작업을 여러 테이블 파티션에 분산하여 스트리밍하는 데 적합합니다. merge-on-read

merge-on-read 구성 (write.update.modewrite.delete.mode, 및write.merge.mode) 을 테이블 수준에서 설정하거나 애플리케이션 측에서 독립적으로 설정할 수 있습니다.

를 merge-on-read 사용하려면 정기적으로 압축을 실행하여 시간이 지나도 읽기 성능이 저하되지 않도록 해야 합니다. 압축은 업데이트 및 삭제를 기존 데이터 파일과 조정하여 새로운 데이터 파일 세트를 생성하므로 읽기 측면에서 발생하는 성능 저하를 방지합니다. 기본적으로 Iceberg의 압축은 delete-file-threshold 속성의 기본값을 더 작은 값으로 변경하지 않는 한 삭제 파일을 병합하지 않습니다 (Iceberg 설명서 참조). 압축에 대한 자세한 내용은 이 가이드의 뒷부분에 있는 Iceberg 압축 섹션을 참조하십시오.

적절한 파일 형식을 선택하세요.

Iceberg는 파켓, ORC, 아브로 형식의 데이터 쓰기를 지원합니다. 파켓이 기본 형식입니다. Parquet 및 ORC는 뛰어난 읽기 성능을 제공하지만 일반적으로 쓰기 속도가 느린 열 형식 형식입니다. 이는 읽기와 쓰기 성능 간의 일반적인 균형을 나타냅니다.

스트리밍 워크로드와 같은 사용 사례에서 쓰기 속도가 중요한 경우 작성기 옵션에서 로 설정하여 Avro 형식으로 작성하는 write-format 것을 Avro 고려해 보십시오. Avro는 행 기반 형식이므로 읽기 성능은 느리지만 쓰기 시간은 더 빠릅니다.

읽기 성능을 개선하려면 일반 압축을 실행하여 작은 Avro 파일을 더 큰 Parquet 파일로 병합하고 변환하십시오. 압축 프로세스의 결과는 테이블 설정에 따라 달라집니다. write.format.default Iceberg의 기본 형식은 Parquet이므로 Avro로 작성한 다음 압축을 실행하면 Iceberg는 Avro 파일을 Parquet 파일로 변환합니다. 다음은 그 예입니다.

spark.sql(f""" CREATE TABLE IF NOT EXISTS glue_catalog.{DB_NAME}.{TABLE_NAME} ( Col_1 float, <<<…other columns…>> ts timestamp) USING iceberg PARTITIONED BY (days(ts)) OPTIONS ( 'format-version'='2', write.format.default'=parquet) """) query = df \ .writeStream \ .format("iceberg") \ .option("write-format", "avro") \ .outputMode("append") \ .trigger(processingTime='60 seconds') \ .option("path", f"glue_catalog.{DB_NAME}.{TABLE_NAME}") \ .option("checkpointLocation", f"s3://{BUCKET_NAME}/checkpoints/iceberg/") .start()