

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

# 쓰기 성능 최적화
<a name="best-practices-write"></a>

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

## 테이블 배포 모드 설정
<a name="write-distribution-mode"></a>

Iceberg는 Spark 작업 전체에 쓰기 데이터가 배포되는 방식을 정의하는 여러 쓰기 배포 모드를 제공합니다. 사용 가능한 모드에 대한 개요는 Iceberg 설명서의 [배포 모드 작성](https://iceberg.apache.org/docs/latest/spark-writes/#writing-distribution-modes)을 참조하세요.

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

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

## 올바른 업데이트 전략 선택
<a name="write-update-strategy"></a>

최신 데이터에 대한 느린 읽기 작업이 사용 사례에 적합한 경우 읽기 merge-on-read** **전략을 사용하여 쓰기 성능을 최적화합니다.

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

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

merge-on-read 사용하려면 시간이 지남에 따라 읽기 성능이 저하되지 않도록 정기적인 압축을 실행해야 합니다. 압축은 기존 데이터 파일과 업데이트 및 삭제를 조정하여 새 데이터 파일 세트를 생성하므로 읽기 측에서 발생하는 성능 저하를 제거합니다. 기본적으로 Iceberg의 압축은 `delete-file-threshold` 속성의 기본값을 더 작은 값으로 변경하지 않는 한 삭제 파일을 병합하지 않습니다( [Iceberg 설명서](https://iceberg.apache.org/docs/latest/spark-procedures/#rewrite_data_files) 참조). 압축에 대해 자세히 알아보려면이 가이드 뒷부분의 [Iceberg 압축](best-practices-compaction.md) 섹션을 참조하세요.

## 올바른 파일 형식 선택
<a name="write-file-format"></a>

Iceberg는 Parquet, ORC 및 Avro 형식의 데이터 쓰기를 지원합니다. Parquet은 기본 형식입니다. Parquet 및 ORC는 우수한 읽기 성능을 제공하지만 일반적으로 쓰기 속도가 느린 열 형식입니다. 이는 읽기 및 쓰기 성능 간의 일반적인 장단점을 나타냅니다.

스트리밍 워크로드와 같이 사용 사례에 쓰기 속도가 중요한 경우 `Avro`라이터의 옵션에서를 로 설정하여 Avro 형식으로 작성하는 `write-format` 것이 좋습니다. 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()
```