

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# 書き込みパフォーマンスの最適化
<a name="best-practices-write"></a>

このセクションでは、エンジンに関係なく Iceberg テーブルの書き込みパフォーマンスを最適化するために調整できるテーブルプロパティについて説明します。

## テーブル分散モードを設定する
<a name="write-distribution-mode"></a>

Iceberg には、Spark タスク間での書き込みデータの分散方法を定義する複数の書き込み分散モードが用意されています。使用可能なモードの概要については、Iceberg ドキュメントの「[Writing Distribution Modes](https://iceberg.apache.org/docs/latest/spark-writes/#writing-distribution-modes)」を参照してください。

特にストリーミングワークロードで書き込み速度を優先するユースケースの場合は、 `write.distribution-mode`を に設定します`none`。これにより、Iceberg は追加の Spark シャッフルをリクエストせず、Spark タスクで使用できるようになるとデータが書き込まれます。このモードは、Spark 構造化ストリーミングアプリケーションに特に適しています。

**注記**  
書き込み分散モードを に設定すると、多数の小さなファイルが生成される`none`傾向があり、読み取りパフォーマンスが低下します。これらの小さなファイルをクエリパフォーマンスのために適切なサイズのファイルに統合するには、定期的に圧縮することをお勧めします。

## 適切な更新戦略を選択する
<a name="write-update-strategy"></a>

読み取りmerge-on-read** **戦略を使用して、最新のデータに対する読み取りオペレーションの遅延がユースケースで許容できる場合に、書き込みパフォーマンスを最適化します。

merge-on-readを使用すると、Iceberg は更新を書き込み、個別の小さなファイルとしてストレージを削除します。テーブルが読み取られると、リーダーはこれらの変更をベースファイルとマージして、データの最新のビューを返す必要があります。これにより、読み取りオペレーションのパフォーマンスが低下しますが、更新と削除の書き込みが高速化されます。通常、merge-on-readは、更新を含むストリーミングワークロードや、多くのテーブルパーティションに分散される更新が少ないジョブに最適です。

merge-on-read設定 (`write.update.mode`、、および `write.merge.mode`) は、テーブルレベルで設定することも`write.delete.mode`、アプリケーション側で個別に設定することもできます。

merge-on-readを使用するには、読み込みパフォーマンスが時間の経過とともに低下するのを防ぐために、定期的な圧縮を実行する必要があります。圧縮は、更新と削除を既存のデータファイルと照合して新しいデータファイルセットを作成するため、読み取り側で発生するパフォーマンスのペナルティを排除します。デフォルトでは、プロパティのデフォルトをより`delete-file-threshold`小さい値に変更しない限り、Iceberg の圧縮は削除ファイルをマージしません ([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`で `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()
```