

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 最佳化儲存體
<a name="best-practices-storage"></a>

更新或刪除 Iceberg 資料表中的資料會增加資料的複本數量，如下圖所示。執行壓縮也是如此：它會增加 Amazon S3 中的資料複本數量。這是因為 Iceberg 將所有資料表基礎的檔案視為不可變。

![\[更新或刪除 Iceberg 資料表中資料的結果\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/apache-iceberg-on-aws/images/optimizing-storage.png)


遵循本節中的最佳實務來管理儲存成本。

## 啟用 S3 Intelligent-Tiering
<a name="storage-s3-intelligent-tiering"></a>

使用 [Amazon S3 Intelligent-Tiering](https://docs.aws.amazon.com/AmazonS3/latest/userguide/intelligent-tiering-overview.html) 儲存類別，在存取模式變更時，自動將資料移至最具成本效益的存取層。此選項不會對效能造成操作額外負荷或影響。 

注意：請勿在 S3 Intelligent-Tiering 搭配 Iceberg 資料表 中使用選用層 （例如 Archive Access 和 Deep Archive Access)。若要封存資料，請參閱下一節中的準則。

您也可以使用 [Amazon S3 生命週期規則](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lifecycle-mgmt.html)來設定自己的規則，將物件移至另一個 Amazon S3 儲存類別，例如 S3 Standard-IA 或 S3 One Zone-IA （請參閱 Amazon S3 文件中的[支援的轉換和相關限制](https://docs.aws.amazon.com/AmazonS3/latest/userguide/lifecycle-transition-general-considerations.html#lifecycle-general-considerations-transition-sc))。

## 封存或刪除歷史快照
<a name="storage-snapshots"></a>

對於 Iceberg 資料表的每個遞交交易 （插入、更新、合併、壓縮），會建立新的資料表版本或快照。隨著時間的推移，Amazon S3 中的版本數量和中繼資料檔案數量會累積。

快照隔離、資料表復原和時間歷程查詢等功能需要保留資料表的快照。不過，儲存成本會隨著您保留的版本數量而增加。

下表說明您可以實作的設計模式，以根據您的資料保留需求來管理成本。


| **設計模式** | **解決方案** | **使用案例** | 
| --- |--- |--- |
| **刪除舊快照** |   使用 Athena 中的 [VACUUM 陳述](https://docs.aws.amazon.com/athena/latest/ug/vacuum-statement.html)式來移除舊快照。此操作不會產生任何運算成本。    或者，您可以在 Amazon EMR 上使用 Spark 或 AWS Glue 移除快照。如需詳細資訊，請參閱 Iceberg 文件中的 [expire\$1snapshots](https://iceberg.apache.org/docs/latest/spark-procedures/#expire_snapshots)。   | 此方法會刪除不再需要的快照，以降低儲存成本。您可以根據您的資料保留需求，設定應保留多少快照或保留多久。此選項會執行快照的硬刪除。您無法復原或時間歷程至過期的快照。 | 
| **設定特定快照的保留政策** |   使用標籤來標記特定快照，並在 Iceberg 中定義保留政策。如需詳細資訊，請參閱 Iceberg 文件中的[歷史標籤](https://iceberg.apache.org/docs/latest/branching/#historical-tags)。 例如，您可以在 Amazon EMR 上的 Spark 中使用下列 SQL 陳述式，每月保留一個快照一年： <pre>ALTER TABLE glue_catalog.db.table <br />CREATE TAG 'EOM-01' AS OF VERSION 30 RETAIN 365 DAYS</pre>   在 Amazon EMR 上使用 Spark 或 AWS Glue 移除剩餘的未標記中繼快照。   | 此模式有助於遵守業務或法律要求，這些要求要求您在過去的特定時間點顯示資料表的狀態。透過在特定標記的快照上放置保留政策，您可以移除已建立的其他 （未標記） 快照。如此一來，您可以滿足資料保留要求，而無需保留建立的每個快照。 | 
| **封存舊快照** |   使用 Amazon S3 標籤以 Spark 標記物件。(Amazon S3 標籤與 Iceberg 標籤不同；如需詳細資訊，請參閱 [Iceberg 文件](https://iceberg.apache.org/docs/latest/aws/#s3-tags)。) 例如： <pre>spark.sql.catalog.my_catalog.s3.delete-enabled=false and \<br />spark.sql.catalog.my_catalog.s3.delete.tags.my_key=to_archive</pre>   在 Amazon EMR 上使用 Spark 或 AWS Glue 移除快照。 [https://iceberg.apache.org/docs/latest/spark-procedures/#expire_snapshots](https://iceberg.apache.org/docs/latest/spark-procedures/#expire_snapshots)當您使用範例中的設定時，此程序會標記物件，並將其從 Iceberg 資料表中繼資料分離，而不是從 Amazon S3 刪除它們。   使用 S3 生命週期規則，將標記為 的物件轉換為`to_archive`其中一個 [S3 Glacier 儲存類別](https://docs.aws.amazon.com/amazonglacier/latest/dev/introduction.html)。   若要查詢封存的資料：   [還原封存的物件](https://docs.aws.amazon.com/AmazonS3/latest/userguide/restoring-objects.html) （如果物件已轉換為 Amazon Glacier Instant Retrieval 儲存類別，則不需要此步驟）。   使用 Iceberg 中的 [register\$1table 程序](https://iceberg.apache.org/docs/latest/spark-procedures/#register_table)，將快照註冊為目錄中的資料表。    如需詳細說明，請參閱 AWS 部落格文章 [改善 Apache Iceberg 資料表建置在 Amazon S3 資料湖上的操作效率](https://aws.amazon.com/blogs/big-data/improve-operational-efficiencies-of-apache-iceberg-tables-built-on-amazon-s3-data-lakes/)。  | 此模式可讓您以較低的成本保留所有資料表版本和快照。在未先將這些版本還原為新資料表的情況下，您無法安排時間或轉返至封存的快照。這通常適用於稽核目的。您可以結合此方法與先前的設計模式，為特定快照設定保留政策。 | 

## 刪除孤立檔案
<a name="storage-orphan-files"></a>

在某些情況下，Iceberg 應用程式可能會在您遞交交易之前失敗。這會在 Amazon S3 中留下資料檔案。由於沒有遞交，因此這些檔案不會與任何資料表相關聯，因此您可能必須以非同步方式清除它們。

若要處理這些刪除，您可以在 Amazon Athena 中使用 [VACUUM 陳述](https://docs.aws.amazon.com/athena/latest/ug/vacuum-statement.html)式。此陳述式會移除快照，也會刪除孤立的檔案。這非常符合成本效益，因為 Athena 不會收取此操作的運算成本。此外，使用 `VACUUM`陳述式時，您不需要排程任何其他操作。

或者，您可以在 Amazon EMR 上使用 Spark 或 AWS Glue 來執行`remove_orphan_files`程序。此操作具有運算成本，必須獨立排程。如需詳細資訊，請參閱 [Iceberg 文件](https://iceberg.apache.org/docs/latest/spark-procedures/#remove_orphan_files)。