

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 优化存储
<a name="best-practices-storage"></a>

更新或删除 Iceberg 表中的数据会增加数据的副本数量，如下图所示。运行压缩也是如此：它增加了 Amazon S3 中的数据副本数量。这是因为 Iceberg 将所有表的底层文件视为不可变的。

![更新或删除 Iceberg 表中数据的结果](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/apache-iceberg-on-aws/images/optimizing-storage.png)


按照本节中的最佳实践来管理存储成本。

## 启用 S3 智能分层
<a name="storage-s3-intelligent-tiering"></a>

当访问模式发生变化时，使用 [Amazon S3 智能分层](https://docs.aws.amazon.com/AmazonS3/latest/userguide/intelligent-tiering-overview.html)存储类自动将数据移至最具成本效益的访问层。此选项没有操作开销或对性能的影响。 

注意：请勿在带有 Iceberg 表的 S3 智能分层中使用可选层（例如存档访问和深度存档访问权限）。要存档数据，请参阅下一节中的指南。

您也可以使用 [Amazon S3 生命周期规则来设置自己的规则](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lifecycle-mgmt.html)，以便将对象移动到其他 Amazon S3 存储类别，例如 S3 标准-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)删除旧的快照。此操作不会产生任何计算成本。    [或者，你可以在亚马逊 EMR 上使用 Spark 或 AWS Glue 删除快照。有关更多信息，请参阅 Iceberg 文档中的 expire\_snapshots。](https://iceberg.apache.org/docs/latest/spark-procedures/#expire_snapshots)   | 这种方法会删除不再需要的快照以降低存储成本。您可以根据数据保留要求配置应保留多少快照或保留多长时间。<br />此选项对快照执行硬删除。您无法回滚或穿越到过期的快照。 | 
| **为特定快照设置保留策略** |   在 Iceberg 中使用标签标记特定的快照并定义保留策略。有关更多信息，请参阅 Iceberg 文档中的[历史标签](https://iceberg.apache.org/docs/latest/branching/#historical-tags)。 <br />例如，您可以在 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)快照。当您使用示例中的设置时，此过程会标记对象并将其与 Iceberg 表元数据分离，而不是将其从 Amazon S3 中删除。   使用 S3 生命周期规则将标记为 `to_archive` S [3 Glacier 存储类](https://docs.aws.amazon.com/amazonglacier/latest/dev/introduction.html)之一的对象过渡。   要查询存档数据，请执行以下操作：   [恢复存档对象](https://docs.aws.amazon.com/AmazonS3/latest/userguide/restoring-objects.html)（如果对象已转换为 Amazon Glacier 即时检索存储类别，则无需执行此步骤）。   使用 Iceberg 中的 [register\_table 过程](https://iceberg.apache.org/docs/latest/spark-procedures/#register_table)将快照注册为目录中的表。    有关详细说明，请参阅 AWS 博客文章[提高在 Amazon S3 数据湖上构建的 Apache Iceberg 表的操作效率](https://aws.amazon.com/blogs/big-data/improve-operational-efficiencies-of-apache-iceberg-tables-built-on-amazon-s3-data-lakes/)。<br />  | 这种模式允许您以较低的成本保留所有表版本和快照。<br />如果不先将这些版本恢复为新表，就无法穿越时空或回滚到存档的快照。出于审计目的，这通常是可以接受的。<br />您可以将此方法与以前的设计模式相结合，为特定的快照设置保留策略。 | 

## 删除孤立文件
<a name="storage-orphan-files"></a>

在某些情况下，Iceberg 应用程序可能会在您提交事务之前失败。这会将数据文件留在 Amazon S3 中。由于没有提交，因此这些文件不会与任何表相关联，因此您可能需要异步清理它们。

要处理这些删除，您可以使用亚马逊 Athena 中的 V [ACUUM 语句](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)。