

# 填充和管理事务表
<a name="populate-otf"></a>

[Apache Iceberg](https://iceberg.apache.org/)、[Apache Hudi](https://hudi.incubator.apache.org/) 和 Linux Foundation [Delta Lake](https://delta.io/) 是开源表格式，专为 Apache Spark 中的大规模数据分析和数据湖工作负载而设计。

您可以使用以下方法在 AWS Glue Data Catalog 中填充 Iceberg、Hudi 和 Delta Lake 表：
+ AWS Glue 爬网程序 – AWS Glue 爬网程序 可以自动发现 Iceberg、Hudi 和 Delta Lake 表元数据并在 Data Catalog 中填充这些数据。有关更多信息，请参阅 [使用爬网程序填充 Data Catalog](add-crawler.md)。
+ AWS Glue ETL 任务 – 您可以创建 ETL 任务，以便将数据写入 Iceberg、Hudi 和 Delta Lake 表，并将其元数据填充到 Data Catalog 中。有关更多信息，请参阅 [Using data lake frameworks with AWS Glue ETL jobs](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-datalake-native-frameworks.html)。
+ AWS Glue 控制台、AWS Lake Formation 控制台、AWS CLI 或 API – 您可以使用 AWS Glue 控制台、Lake Formation 控制台或 API 在 Data Catalog 中创建和管理 Iceberg 表定义。

**Topics**
+ [创建 Apache Iceberg 表](#creating-iceberg-tables)
+ [优化 Iceberg 表](table-optimizers.md)
+ [优化 Iceberg 表的查询性能](iceberg-column-statistics.md)

## 创建 Apache Iceberg 表
<a name="creating-iceberg-tables"></a>

您可以使用驻留在 Amazon S3 中的数据在 AWS Glue Data Catalog 中创建使用 Apache Parquet 数据格式的 Apache Iceberg 表。该数据目录中的表是表示数据存储中数据的元数据定义。默认情况下，AWS Glue 会创建 Iceberg v2 表。有关 v1 和 v2 表之间的区别，请参阅 Apache Iceberg 文档中的[格式版本更改](https://iceberg.apache.org/spec/#appendix-e-format-version-changes)。

 [Apache Iceberg](https://iceberg.apache.org/) 是适用于超大型分析数据集的开放表格式。Iceberg 允许轻松更改架构，也称为架构发展，这意味着用户可以在不破坏基础数据的情况下添加、重命名或删除数据表中的列。Iceberg 还支持数据版本控制，允许用户跟踪数据随时间的变化。这将启用时间旅行功能，该功能允许用户访问和查询数据的历史版本，并分析更新和删除之间的数据更改。

您可以使用 AWS Glue 或 Lake Formation 控制台或 AWS Glue API 中的 `CreateTable` 操作在 Data Catalog 中创建 Iceberg 表。有关更多信息，请参阅 [CreateTable 操作 (Python: create\$1table)](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-catalog-tables.html#aws-glue-api-catalog-tables-CreateTable)。

在数据目录中创建 Iceberg 表时，您必须在 Amazon S3 中指定表格式和元数据文件路径，以便能够执行读取和写入操作。

 当您向 AWS Lake Formation 注册 Amazon S3 数据位置时，您可以使用 Lake Formation 通过精细访问控制权限来保护 Iceberg 表。对于 Amazon S3 中的源数据和未向 Lake Formation 注册的元数据，访问权限由 Amazon S3 和 AWS Glue 操作的 IAM 权限策略决定。有关更多信息，请参阅 [Managing permissions](https://docs.aws.amazon.com/lake-formation/latest/dg/managing-permissions.html)。

**注意**  
数据目录不支持创建分区和添加 Iceberg 表属性。

### 先决条件
<a name="iceberg-prerequisites"></a>

 要在数据目录中创建 Iceberg 表并设置 Lake Formation 数据访问权限，您需要完成以下要求：

1. 

**在没有向 Lake Formation 注册数据的情况下创建 Iceberg 表所需的权限。**

   除了在数据目录中创建表所需的权限外，表创建者还需要以下权限：
   + 针对资源 arn:aws:s3:::\$1bucketName\$1 的 `s3:PutObject`
   + 针对资源 arn:aws:s3:::\$1bucketName\$1 的 `s3:GetObject`
   + 针对资源 arn:aws:s3:::\$1bucketName\$1 的 `s3:DeleteObject`

1. 

**使用向 Lake Formation 注册的数据创建 Iceberg 表所需的权限：**

   要使用 Lake Formation 管理和保护数据湖中的数据，请向 Lake Formation 注册包含表数据的 Amazon S3 位置。这样，Lake Formation 就可以向 Athena、Redshift Spectrum 和 Amazon EMR 等 AWS 分析服务提供凭证以访问数据。有关注册 Amazon S3 位置的更多信息，请参阅 [Adding an Amazon S3 location to your data lake](https://docs.aws.amazon.com/lake-formation/latest/dg/register-data-lake.html)。

   读取和写入向 Lake Formation 注册的基础数据的主体需要以下权限：
   + `lakeformation:GetDataAccess`
   + `DATA_LOCATION_ACCESS`

     对某个位置具有数据位置权限的主体也对所有子位置具有位置权限。

     有关数据位置权限的更多信息，请参阅 [Underlying data access control](https://docs.aws.amazon.com/lake-formation/latest/dg/access-control-underlying-data.html#data-location-permissions) Ulink。

 要启用压缩，该服务需要代入有权更新数据目录中的表的 IAM 角色。有关详细信息，请参阅 [表优化的先决条件](optimization-prerequisites.md) 

### 创建 Iceberg 表
<a name="create-iceberg-table"></a>

您可以使用 AWS Glue 或 Lake Formation 控制台或 AWS Command Line Interface 创建 Iceberg v1 和 v2 表，如本页所述。您也可以使用 AWS Glue 爬网程序 创建 Iceberg 表。有关更多信息，请参阅《AWS Glue 开发人员指南》中的[数据目录和爬网程序](https://docs.aws.amazon.com/glue/latest/dg/catalog-and-crawler.html)。

**创建 Iceberg 表**

------
#### [ Console ]

1. 登录 AWS 管理控制台，然后打开 AWS Glue 控制台，网址为：[https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/)。

1. 在数据目录下，选择**表**，然后使用**创建表**按钮指定以下属性：
   + **表名称** – 输入表的唯一名称。如果您使用 Athena 访问表，请使用《Amazon Athena 用户指南》中的这些[命名提示](https://docs.aws.amazon.com/athena/latest/ug/tables-databases-columns-names.html)。
   + **数据库** – 选择现有数据库或创建新数据库。
   + **描述** – 表的描述。您可以编写描述以帮助您了解表的内容。
   + **表格式** – 对于**表格式**，请选择 Apache Iceberg。
   + **启用压缩** – 选择**启用压缩**，将表中较小的 Amazon S3 对象压缩成较大对象。
   + **IAM 角色** – 为了运行压缩，该服务会代表您代入一个 IAM 角色。您可以使用下拉列表选择一个 IAM 角色。确保该角色具有启用压缩所需的权限。

     要了解有关所需权限的更多信息，请参阅[表优化的先决条件](optimization-prerequisites.md)。
   + **位置** – 指定 Amazon S3 中存储元数据表的文件夹的路径。Iceberg 需要数据目录中的元数据文件和位置才能执行读取和写入。
   + **架构** – 选择**添加列**以添加列和列的数据类型。您可以选择创建一个空表，然后稍后更新架构。数据目录支持 Hive 数据类型。有关更多信息，请参阅 [Hive 数据类型](https://cwiki.apache.org/confluence/plugins/servlet/mobile?contentId=27838462#content/view/27838462)。

      Iceberg 允许您在创建表后演变架构和分区。您可以使用 [Athena 查询](https://docs.aws.amazon.com/athena/latest/ug/querying-iceberg-evolving-table-schema.html)更新表架构，使用 [Spark 查询](https://iceberg.apache.org/docs/latest/spark-ddl/#alter-table-sql-extensions)更新分区。

------
#### [ AWS CLI ]

```
aws glue create-table \
    --database-name iceberg-db \
    --region us-west-2 \
    --open-table-format-input '{
      "IcebergInput": { 
           "MetadataOperation": "CREATE",
           "Version": "2"
         }
      }' \
    --table-input '{"Name":"test-iceberg-input-demo",
            "TableType": "EXTERNAL_TABLE",
            "StorageDescriptor":{ 
               "Columns":[ 
                   {"Name":"col1", "Type":"int"}, 
                   {"Name":"col2", "Type":"int"}, 
                   {"Name":"col3", "Type":"string"}
                ], 
               "Location":"s3://DOC_EXAMPLE_BUCKET_ICEBERG/"
            }
        }'
```

------

**Topics**
+ [先决条件](#iceberg-prerequisites)
+ [创建 Iceberg 表](#create-iceberg-table)

# 优化 Iceberg 表
<a name="table-optimizers"></a>

AWS Glue 支持多种表优化选项，以增强 AWS 分析引擎和 ETL 作业使用的 Apache Iceberg 表的管理和性能。这些优化器可提高存储空间利用效率、提升查询性能，并实现有效的数据管理。AWS Glue 中提供了三种表优化器：
+ **压缩** – 数据压缩功能可压缩小数据文件，以减少存储空间使用量并提升读取性能。此功能会合并和重写数据文件以移除过时数据，并将碎片数据合并到更大、更高效的文件中。您可以将压缩配置为自动运行。

  Binpack 是 Apache Iceberg 中的默认压缩策略。该策略会将较小的数据文件合并为较大的数据文件，从而实现最佳性能。压缩还支持将相似数据聚类在一起的排序和 Z 形排序策略。排序策略根据指定列整理数据，从而提高筛选出的操作的查询性能。Z 形排序会形成排序后的数据集，可在同时查询多列时提高查询性能。所有这三种压缩策略（bincpak、排序和 Z 形排序）都可减少查询引擎要扫描的数据量，从而降低查询处理成本。
+ **快照保留** – 快照是带有时间戳的 Iceberg 表版本。借助快照保留配置，客户可以强制规定快照保留期限和要保留的快照数量。配置快照保留优化器可以移除不必要的旧快照及其相关底层文件，从而帮助管理存储开销。
+ **孤立文件删除** – 孤立文件是指不再被 Iceberg 表元数据引用的文件。这些文件可能会逐渐堆积，尤其是在表删除或 ETL 任务失败等操作之后。启用孤立文件删除功能后，AWS Glue 会定期识别并移除这些不必要的文件，从而释放存储空间。

可通过 Lake Formation 控制台，使用 AWS Glue `UpdateCatalog` API 操作实现目录级优化配置。您可以使用 AWS Glue 控制台、AWS CLI 或 AWS Glue API 操作，在数据目录中为单个 Iceberg 表启用或禁用压缩、快照保留和孤立文件删除优化器。

 以下视频说明了如何在数 Data Catalog 中为 Iceberg 表配置优化器。

[![AWS Videos](http://img.youtube.com/vi/https://www.youtube.com/embed/xOXE7AS-pNA?si=lKvt_TSlPkoc6OXn/0.jpg)](http://www.youtube.com/watch?v=https://www.youtube.com/embed/xOXE7AS-pNA?si=lKvt_TSlPkoc6OXn)


**Topics**
+ [表优化的先决条件](optimization-prerequisites.md)
+ [目录级表优化器](catalog-level-optimizers.md)
+ [优化压缩](compaction-management.md)
+ [快照保留优化](snapshot-retention-management.md)
+ [删除孤立文件](orphan-file-deletion.md)
+ [查看优化详细信息](view-optimization-status.md)
+ [查看 Amazon CloudWatch 指标](view-optimization-metrics.md)
+ [删除优化器](delete-optimizer.md)
+ [注意事项和限制](optimizer-notes.md)
+ [表优化器支持的区域](regions-optimizers.md)

# 表优化的先决条件
<a name="optimization-prerequisites"></a>

表优化器会代入您在为表启用优化选项（压缩、快照保留和孤立文件删除）时指定的 AWS Identity and Access Management（IAM）角色的权限。可以创建单个角色并用于所有优化器，也可以为每个优化器分别创建单独的角色。

**注意**  
孤立文件删除优化器不需要 `glue:updateTable` 或 `s3:putObject` 权限。快照过期和压缩优化器需要相同的权限集。

该 IAM 角色必须具有读取数据和更新数据目录中元数据的权限。您可以创建一个 IAM 角色并附加以下内联策略：
+ 添加以下内联策略，以向 Amazon S3 授予对未注册到 AWS Lake Formation 的数据位置的读/写权限。此策略还包括更新数据目录中表的权限，以及允许 AWS Glue 在 Amazon CloudWatch 日志中添加日志并发布指标的权限。对于 Amazon S3 中未注册到 Lake Formation 的源数据，访问权限由 Amazon S3 和 AWS Glue 操作的 IAM 权限策略决定。

  请将以下内联策略中的 `bucket-name` 替换为您的 Amazon S3 存储桶名称，请将 `aws-account-id` 和 `region` 替换为有效的 AWS 账户和数据目录所在的区域，将 `database_name` 替换为数据库的名称，并将 `table_name` 替换为表的名称。

------
#### [ JSON ]

****  

  ```
  {
      "Version":"2012-10-17",		 	 	 
      "Statement": [
          {
              "Effect": "Allow",
              "Action": [
                  "s3:PutObject",
                  "s3:GetObject",
                  "s3:DeleteObject"
              ],
              "Resource": [
                  "arn:aws:s3:::amzn-s3-demo-bucket/*"
              ]
          },
          {
              "Effect": "Allow",
              "Action": [
                  "s3:ListBucket"
              ],
              "Resource": [
                  "arn:aws:s3:::amzn-s3-demo-bucket"
              ]
          },
          {
              "Effect": "Allow",
              "Action": [
                  "glue:UpdateTable",
                  "glue:GetTable"
              ],
              "Resource": [
                  "arn:aws:glue:us-east-1:111122223333:table/<database-name>/<table-name>",
                  "arn:aws:glue:us-east-1:111122223333:database/<database-name>",
                  "arn:aws:glue:us-east-1:111122223333:catalog"
              ]
          },
          {
              "Effect": "Allow",
              "Action": [
                  "logs:CreateLogGroup",
                  "logs:CreateLogStream",
                  "logs:PutLogEvents"
              ],
              "Resource": [
                  "arn:aws:logs:us-east-1:111122223333:log-group:/aws-glue/iceberg-compaction/logs:*",
                  "arn:aws:logs:us-east-1:111122223333:log-group:/aws-glue/iceberg-retention/logs:*",
                  "arn:aws:logs:us-east-1:111122223333:log-group:/aws-glue/iceberg-orphan-file-deletion/logs:*"
              ]
          }
      ]
  }
  ```

------
+ 使用以下策略为注册到 Lake Formation 的数据启用压缩功能。

  如果该优化角色不具有对表的 `IAM_ALLOWED_PRINCIPALS` 组权限，则该角色需要具有对该表的 Lake Formation `ALTER`、`DESCRIBE`、`INSERT` 和 `DELETE` 权限。

  有关向 Lake Formation 注册 Amazon S3 存储桶的更多信息，请参阅 [Adding an Amazon S3 location to your data lake](https://docs.aws.amazon.com/lake-formation/latest/dg/register-data-lake.html)。

------
#### [ JSON ]

****  

  ```
  {
    "Version":"2012-10-17",		 	 	 
    "Statement": [
      {
        "Effect": "Allow",
        "Action": [
          "lakeformation:GetDataAccess"
        ],
        "Resource": "*"
      },
      {
        "Effect": "Allow",
        "Action": [
          "glue:UpdateTable",
          "glue:GetTable"
        ],
        "Resource": [
          "arn:aws:glue:us-east-1:111122223333:table/databaseName/tableName",
          "arn:aws:glue:us-east-1:111122223333:database/databaseName",
          "arn:aws:glue:us-east-1:111122223333:catalog"
        ]
      },
      {
        "Effect": "Allow",
        "Action": [
          "logs:CreateLogGroup",
          "logs:CreateLogStream",
          "logs:PutLogEvents"
        ],
        "Resource": [
          "arn:aws:logs:us-east-1:111122223333:log-group:/aws-glue/iceberg-compaction/logs:*",
          "arn:aws:logs:us-east-1:111122223333:log-group:/aws-glue/iceberg-retention/logs:*",
          "arn:aws:logs:us-east-1:111122223333:log-group:/aws-glue/iceberg-orphan-file-deletion/logs:*"
        ]
      }
    ]
  }
  ```

------
+ （可选）如果要优化的 Iceberg 表包含使用[服务器端加密](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingKMSEncryption.html)进行加密的 Amazon S3 存储桶中数据，则该压缩角色需要具有解密 Amazon S3 对象并生成新数据密钥，以将对象写入加密存储桶的权限。将以下策略添加到需要的 AWS KMS 密钥。我们仅支持在存储桶级加密。

  ```
  {
      "Effect": "Allow",
      "Principal": {
          "AWS": "arn:aws:iam::<aws-account-id>:role/<optimizer-role-name>"
      },
      "Action": [
          "kms:Decrypt",
          "kms:GenerateDataKey"
      ],
      "Resource": "*"
  }
  ```
+  （可选）对于注册到 Lake Formation 的数据位置，用于注册该位置的角色需要具有解密 Amazon S3 对象并生成新数据密钥以将对象写入加密存储桶的权限。有关更多信息，请参阅 [Registering an encrypted Amazon S3 location](https://docs.aws.amazon.com/lake-formation/latest/dg/register-encrypted.html)。
+ （可选）如果 AWS KMS 密钥存储在其他 AWS 账户中，则需要为该压缩角色添加以下权限。

------
#### [ JSON ]

****  

  ```
  {
    "Version":"2012-10-17",		 	 	 
    "Statement": [
      {
        "Effect": "Allow",
        "Action": [
          "kms:Decrypt",
          "kms:GenerateDataKey"
        ],
        "Resource": [
          "arn:aws:kms:us-east-1:111122223333:key/key-id"
        ]
      }
    ]
  }
  ```

------
+  用于运行压缩的角色必须拥有该角色的 `iam:PassRole` 权限。

------
#### [ JSON ]

****  

  ```
  {
    "Version":"2012-10-17",		 	 	 
    "Statement": [
      {
        "Effect": "Allow",
        "Action": [
          "iam:PassRole"
        ],
        "Resource": [
          "arn:aws:iam::111122223333:role/<optimizer-role-name>"
        ]
      }
    ]
  }
  ```

------
+ 将以下信任策略添加到该角色，以便 AWS Glue 服务代入该 IAM 角色来运行压缩进程。

------
#### [ JSON ]

****  

  ```
  {
    "Version":"2012-10-17",		 	 	 
    "Statement": [
      {
        "Sid": "",
        "Effect": "Allow",
        "Principal": {
          "Service": "glue.amazonaws.com"
        },
        "Action": "sts:AssumeRole"
      }
    ]
  }
  ```

------
+ <a name="catalog-optimizer-requirement"></a> （可选）要更新 Data Catalog 设置以启用目录级表优化，使用的 IAM 角色必须对根目录具有 `glue:UpdateCatalog` 权限或 AWS Lake Formation `ALTER CATALOG` 权限。您可以使用 `GetCatalog` API 来验证目录属性。

# 目录级表优化器
<a name="catalog-level-optimizers"></a>

使用一次性目录配置，可以为 AWS Glue Data Catalog 中所有新增和更新后的 Apache Iceberg 表设置自动优化器，例如压缩、快照保留和孤立文件删除等优化器。使用目录级优化器配置，可以在目录的所有表中应用一致的优化器设置，无需为每个表单独配置优化器。

数据湖管理员可以在 Lake Formation 控制台中选择默认目录，并使用 `Table optimization` 选项启用优化器，从而配置表优化器。在 Data Catalog 中创建新表或更新现有表时，Data Catalog 会自动运行表优化来减轻运维负担。

如果已在表级别配置优化，或曾删除某表的优化设置，这些表级特定设置将优先于表优化的默认目录设置。若未在表或目录级别定义配置参数，则将应用 Iceberg 表属性值。该设置适用于快照保留和孤立文件删除优化器。

启用目录级优化器时，需注意以下事项：
+ 在创建目录时配置优化设置，随后通过“更新目录”请求禁用优化时，该操作将级联到目录中的所有表。
+ 若已为某表配置优化器，则目录级别的禁用操作不会影响该表。
+ 在目录级别禁用优化器后，具有现有优化器配置的表将保持其特定设置，并且不受目录级更改的影响。不过，没有专属优化器配置的表会继承目录级别的禁用状态。
+ 由于快照保留和孤立文件删除优化器支持基于调度的运行模式，配置更新将为其调度起始时间引入随机延迟。这使得每个优化器的启动时间各有不同，从而分散系统负载并降低超出服务限制的可能性。
+ 启用 AWS Glue Data Catalog 加密后，表不会自动沿用目录级别的优化器设置。如果您的目录启用了元数据加密，则必须为每个表单独配置表优化器。要沿用目录级优化器，必须在目录上禁用元数据加密。

**Topics**
+ [启用目录级自动表优化](enable-auto-table-optimizers.md)
+ [查看目录级优化](view-catalog-optimizations.md)
+ [禁用目录级表优化](disable-auto-table-optimizers.md)

# 启用目录级自动表优化
<a name="enable-auto-table-optimizers"></a>

 您可以为 Data Catalog 中的所有 Apache Iceberg 新表启用自动表优化。创建表后，还可以手动显式更新表优化设置。

 要更新 Data Catalog 设置以启用目录级表优化，使用的 IAM 角色必须对根目录具有 `glue:UpdateCatalog` 权限。您可以使用 `GetCatalog` API 来验证目录属性。

 对于 Lake Formation 托管式表，在目录优化配置期间选择的 IAM 角色需要任何新表或更新后的表的 Lake Formation `ALTER`、`DESCRIBE`、`INSERT` 以及 `DELETE` 权限。

## 启用目录级优化器（控制台）
<a name="enable-catalog-optimizers-console"></a>

1. 通过 [https://console.aws.amazon.com/lakeformation/](https://console.aws.amazon.com/lakeformation/) 打开 Lake Formation 控制台。

1. 在导航窗格中，选择 **Data Catalog**。

1. 选择**目录**选项卡。

1. 选择账户级别目录。

1. 在**表优化**选项卡下选择**表优化**、**编辑**。也可在**操作**中选择**编辑优化**。  
![\[屏幕截图，其中显示了在目录级别启用优化的编辑选项。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/catalog-edit-optimizations.png)

1. 在**表优化**页面上配置以下选项：  
![\[屏幕截图，其中显示了目录级别的优化选项。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/catalog-optimization-options.png)

   1. 配置**压缩**设置：
      + 启用/禁用压缩功能。
      + 选择具有运行优化器所需权限的 IAM 角色。

        有关 IAM 角色权限要求的更多信息，请参阅[表优化的先决条件](optimization-prerequisites.md)。

   1. 配置**快照保留**设置：
      + 启用/禁用保留功能。
      + 设置以天为单位的快照保留期：默认值为 5 天。
      + 设置要保留的快照数量：默认值为 1 个快照。
      + 启用/禁用过期文件清理功能。

   1. 配置**孤立文件删除**设置：
      + 启用/禁用孤立文件删除功能。
      + 设置以天为单位的孤立文件保留期：默认值为 3 天。

1. 选择**保存**。

## 通过 AWS CLI 启用目录级优化器
<a name="catalog-auto-optimizers-cli"></a>

使用以下 CLI 命令更新现有目录的优化器设置：

**Example 更新目录的优化器设置**  

```
aws glue update-catalog \
   --name catalog-id \
  --catalog-input \
  '{
    "CatalogId": "111122223333",
    "CatalogInput": {
        "CatalogProperties": {
            "CustomProperties": {
                "ColumnStatistics.Enabled": "false",
                "ColumnStatistics.RoleArn": "arn:aws:iam::111122223333:role/service-role/stats-role-name"
            },
            "IcebergOptimizationProperties": {
                "RoleArn": "arn:aws:iam::111122223333:role/optimizer-role-name",
                "Compaction": {
                    "enabled": "true"
                },
                "Retention": {
                    "enabled": "true",
                    "snapshotRetentionPeriodInDays": "10",
                    "numberOfSnapshotsToRetain": "5",
                    "cleanExpiredFiles": "true"
                },
                "OrphanFileDeletion": {
                    "enabled": "true",
                    "orphanFileRetentionPeriodInDays": "3"
                }
            }
        }
    }
}'
```

如果在使用目录级优化器时遇到问题，请检查以下内容：
+ 确保 IAM 角色具有“先决条件”部分所述的正确权限。
+ 查看 CloudWatch 日志，了解与优化器操作相关的任何错误信息。

   有关更多信息，请参阅《Amazon CloudWatch 用户指南》中的[查看可用的指标](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/viewing_metrics_with_cloudwatch.html)**。
+ 检查目录配置，确认目录设置是否已成功应用。
+ 对于表访问失败，请查看 CloudWatch 日志和 EventBridge 通知，了解详细的错误信息。

# 查看目录级优化
<a name="view-catalog-optimizations"></a>

 启用目录级表优化后，每当在 AWS 管理控制台、SDK 或 AWS Glue 爬网程序 中通过 `CreateTable` 或 `UpdateTable` API 创建或更新 Apache Iceberg 表时，都会为该表创建等效的表级设置。

 创建或更新表后，您可以查验表详细信息来确认表优化。`Table optimization` 显示设置为 `Catalog` 的 `Configuration source` 属性。

![\[已应用具有目录级优化配置的 Apache Iceberg 表的图像。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/catalog-optimization-enabled.png)


# 禁用目录级表优化
<a name="disable-auto-table-optimizers"></a>

 使用 AWS Lake Formation 控制台或 `glue:UpdateCatalog` API 可以禁用新表的表优化。

**在目录级别禁用表优化**

1. 通过 [https://console.aws.amazon.com/lakeformation/](https://console.aws.amazon.com/lakeformation/) 打开 Lake Formation 控制台。

1. 在左侧导航栏上，选择**目录**。

1. 在**目录摘要**页面上，选择**表优化**下的**编辑**。

1. 在**编辑优化**页面上，取消选择**优化选项**。

1. 选择**保存**。

# 优化压缩
<a name="compaction-management"></a>

 使用 Apache Iceberg 等开放表格式的 Amazon S3 数据湖会将数据存储为 S3 对象。如果数据湖表中包含成千上万个 Amazon S3 小对象，则会增加元数据开销并影响读取性能。AWS Glue Data Catalog 为 Iceberg 表提供了托管式压缩功能，可将小对象压缩成较大的对象，以便提高 Amazon Athena 和 Amazon EMR 等 AWS 分析服务以及 AWS Glue ETL 作业的读取性能。Data Catalog 会在不干扰并发查询的情况下执行压缩，并且仅支持 Parquet 格式表的压缩。

表优化器会持续监控表分区，并在超过文件数量和文件大小阈值时启动压缩进程。

在 Data Catalog 中，当表或其中的任何分区包含超过 100 个文件时，压缩进程就会启动。每个文件必须小于目标文件大小的 75%。目标文件大小由 `write.target-file-size-bytes` 表属性定义，如果未显式设置，则默认为 512 MB。

 有关限制，请参阅[托管式数据压缩的支持的格式和限制](optimizer-notes.md#compaction-notes)。

**Topics**
+ [启用压缩优化器](enable-compaction.md)
+ [禁用压缩优化器](disable-compaction.md)

# 启用压缩优化器
<a name="enable-compaction"></a>

 您可以在 AWS Glue Data Catalog 中使用 AWS Glue 控制台、AWS CLI 或 AWS API 为 Apache Iceberg 表启用压缩。对于新表，您可以在创建表时选择 Apache Iceberg 表格式并启用压缩。新表会默认禁用压缩。

------
#### [ Console ]

**启用压缩**

1.  打开 AWS Glue 控制台（[https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/)），然后以数据湖管理员、表创建者或已被授予表的 `glue:UpdateTable` 和 `lakeformation:GetDataAccess` 权限的用户身份登录。

1. 在导航窗格的**数据目录**下，请选择**表**。

1. 在**表**页面上，选择要为其启用压缩的开放表格式的表，然后在**操作**菜单下，选择**优化**，然后选择**启用**。

   您还可以通过选择**表详细信息**页面中的**表优化**来启用压缩。选择页面下半部的**表优化**选项卡，然后选择**启用压缩**。

   在 Data Catalog 中创建新的 Iceberg 表时，也可以使用**启用优化**选项。

1. 在**启用优化**页面上，选择**优化选项**下的**压缩**。  
![\[同时选中“Apache Iceberg 表详细信息”页面和“启用压缩”选项。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/table-enable-compaction.png)

1. 然后从下拉列表中选择一个具有 [表优化的先决条件](optimization-prerequisites.md) 部分所示权限的 IAM 角色。

   还可以选择**创建新 IAM 角色**选项来创建一个具有运行压缩所需权限的自定义角色。

    按照以下步骤更新一个现有的 IAM 角色：

   1.  要更新 IAM 角色的权限策略，请在 IAM 控制台中转到用于运行压缩的 IAM 角色。

   1.  在**添加权限**部分中，选择“创建策略”。在新打开的浏览器窗口中，创建将用于您的角色的新策略。

   1. 在“创建策略”页面上，选择 `JSON` 选项卡。将“先决条件”中显示的 JSON 代码复制到策略编辑器字段中。

1. 如果您有安全策略配置，其中 Iceberg 表优化器需要从特定的虚拟私有云（VPC）访问 Amazon S3 存储桶，则请创建 AWS Glue 网络连接或使用现有网络连接。

   如果您尚未设置 AWS Glue VPC 连接，则请使用 AWS Glue 控制台或 AWS CLI/SDK 按照[为连接器创建连接](https://docs.aws.amazon.com/glue/latest/dg/creating-connections.html)部分中的步骤创建一个新连接。

1. 选择压缩策略。可用选项如下：
   + **Binpack**：Binpack 是 Apache Iceberg 中的默认压缩策略。该策略会将较小的数据文件合并为较大的数据文件，从而实现最佳性能。
   + **排序**：排序是 Apache Iceberg 中的一种数据整理技术，根据指定列对文件中的信息进行聚类，从而通过减少需要处理的文件数量来显著提高查询性能。您可以使用排序字段定义 Iceberg 元数据中的排序顺序，并且在指定多个列时，数据将按照这些列在排序顺序中显示的顺序排序，从而确保将具有相似值的记录一起存储在文件中。排序压缩策略通过对分区内所有文件中的数据进行排序，实现进一步的优化。
   + **Z 序**：Z 形排序是按具有同等重要性的多列进行排序时的数据整理方式。在传统排序方式中，总有一列优先于其他列；而 Z 形排序对每列赋予均衡权重，有助于查询引擎减少在搜索数据时要读取的文件数。

     这种方法的原理是将来自不同列的值的二进制数编织在一起。例如，假设有来自两列的数字 3 和 4，首先用 Z 序编码将其转换为二进制（3 变为 011，4 变为 100），然后将这些数字交错，从而创建一个新值：011010。这种交错编织形成了一种模式，使相关数据在物理上相互紧挨。

     Z 形排序对多维查询尤其有效。例如，客户的表按收入、州和邮政编码进行 Z 形排序，在跨多个维度进行查询时的性能优于分层排序。该组织允许按特定的收入和地理位置组合进行查询，从而快速找到相关数据，同时尽可能减少不必要的文件扫描。

1. **最小输入文件数**：触发压缩之前分区中所需的数据文件数量。

1. **删除文件阈值**：数据文件在符合压缩条件之前所需的最小删除操作次数。

1. 选择**启用优化**。

------
#### [ AWS CLI ]

 以下示例演示如何启用压缩。将账户 ID 替换为有效的 AWS 账户 ID。将数据库名称和表名称替换为实际的 Iceberg 表名称和数据库名称。将 `roleArn` 替换为 IAM 角色的 AWS 资源名称 (ARN) 以及具有运行压缩所需权限的 IAM 角色的名称。您可以将压缩策略 `sort` 替换为其他支持的策略，例如 `z-order` 或 `binpack`。

顺序取决于您的需求。

```
aws glue create-table-optimizer \
  --catalog-id 123456789012 \
  --database-name iceberg_db \
  --table-name iceberg_table \
  --table-optimizer-configuration '{
    "roleArn": "arn:aws:iam::123456789012:role/optimizer_role",
    "enabled": true,
    "vpcConfiguration": {"glueConnectionName": "glue_connection_name"},
    "compactionConfiguration": {
      "icebergConfiguration": {"strategy": "sort"}
    }
  }'\
--type compaction
```

------
#### [ AWS API ]

调用 [CreateTableOptimizer](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-table-optimizers.html#aws-glue-api-table-optimizers-CreateTableOptimizer) 操作为表启用压缩。

------

启用压缩后，**表优化**选项卡会在压缩运行完成后显示以下压缩详细信息：

开始时间  
压缩进程在 Data Catalog 中启动的时间。该值是一个采用 UTC 时间格式的时间戳。

结束时间  
数据目录中压缩进程结束的时间。该值是一个采用 UTC 时间格式的时间戳。

Status  
压缩运行的状态。值为成功或失败。

已压缩的文件数  
已压缩的文件总数。

已压缩的字节数  
已压缩的字节总数。

# 禁用压缩优化器
<a name="disable-compaction"></a>

 您可以使用 AWS Glue 控制台或 AWS CLI 来为特定 Apache Iceberg 表禁用自动压缩。

------
#### [ Console ]

1. 登录 AWS 管理控制台，然后打开 AWS Glue 控制台，网址为：[https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/)。

1. 在左侧导航窗格的 **Data Catalog** 下，选择**表**。

1. 从表列表中，选择要禁用压缩的 Iceberg 表。

1. 在**表详细信息**页面的下半部分，选择**表优化**选项卡。

1. 从**操作**中选择**禁用**，然后选择**压缩**。

1.  在确认消息页面选择**禁用压缩**。您可以在以后重新启用压缩。

    确认后，压缩将被禁用，并且表的压缩状态将恢复为 `Disabled`。

------
#### [ AWS CLI ]

将以下示例中的账户 ID 替换为有效的 AWS 账户 ID。将数据库名称和表名称替换为实际的 Iceberg 表名称和数据库名称。将 `roleArn` 替换为 IAM 角色的 AWS 资源名称 (ARN) 以及具有运行压缩所需权限的 IAM 角色的实际名称。

```
aws glue update-table-optimizer \
  --catalog-id 123456789012 \
  --database-name iceberg_db \
  --table-name iceberg_table \
  --table-optimizer-configuration '{"roleArn":"arn:aws:iam::123456789012:role/optimizer_role", "enabled":'false', "vpcConfiguration":{"glueConnectionName":"glue_connection_name"}}'\ 
  --type compaction
```

------
#### [ AWS API ]

调用 [UpdateTableOptimizer](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-table-optimizers.html#aws-glue-api-table-optimizers-UpdateTableOptimizer) 操作以为特定的表禁用压缩。

------

# 快照保留优化
<a name="snapshot-retention-management"></a>

借助 Apache Iceberg 快照保留功能，用户可以查询特定时间点的历史数据并撤销对表的非预期修改。在 AWS Glue Data Catalog 中，快照保留配置功能会控制这些快照（表数据的不同版本）在过期和移除之前的保留期限。该功能会根据配置的保留期或要保留的最大快照数量自动移除较早的快照，有助于管理存储成本和元数据开销。

您可以为表配置保留期（以天为单位）和要保留的最大快照数量。AWS Glue 会从表元数据中移除早于指定保留期的快照，同时确保最新的快照数量保持在配置的限制范围内。从元数据中移除旧快照后，AWS Glue 会删除不再引用并且是已过期快照所独有的对应数据和元数据文件。这有利于确保仅需查询剩余保留的快照，同时回收已过期快照数据占用的存储空间。

**Topics**
+ [启用快照保留优化器](enable-snapshot-retention.md)
+ [更新快照保留优化器](update-snapshot-retention.md)
+ [禁用快照保留优化器](disable-snapshot-retention.md)

# 启用快照保留优化器
<a name="enable-snapshot-retention"></a>

 您可以在 Data Catalog 中使用 AWS Glue 控制台、AWS CLI 或 AWS API 为 Apache Iceberg 表启用快照保留优化器。对于新表，您可以在创建表时选择 Apache Iceberg 表格式并启用快照保留优化器。新表会默认禁用快照保留功能。

------
#### [ Console ]

**启用快照保留优化器**

1.  打开 AWS Glue 控制台（[https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/)），然后以数据湖管理员、表创建者或已被授予表的 `glue:UpdateTable` 和 `lakeformation:GetDataAccess` 权限的用户身份登录。

1. 在导航窗格的**数据目录**下，请选择**表**。

1. 在**表**页面上，选择要为其启用快照保留优化器的 Iceberg 表，然后在**操作**菜单下，选择**优化**下的**启用**。

   您也可以通过选中该表并打开**表详细信息**页面来启用优化。选择页面下半部的**表优化**选项卡，然后选择**启用快照保留**。

1. **启用优化**页面的**优化配置**下有两个选项：**使用默认设置**或**自定义设置**。如果您选择使用默认设置，则 AWS Glue 会使用 Iceberg 表配置中定义的属性来确定快照保留期和要保留的快照数量。如果没有此配置，AWS Glue 会将一个快照保留五天，并删除与过期快照关联的文件。

1.  然后选择 AWS Glue 可以代表您代入以运行优化器的 IAM 角色。有关 IAM 角色所需权限的详细信息，请参阅[表优化的先决条件](optimization-prerequisites.md)部分。

   按照以下步骤更新一个现有的 IAM 角色：

   1.  要更新 IAM 角色的权限策略，请在 IAM 控制台中转到用于运行压缩的 IAM 角色。

   1.  在添加权限部分中，选择“创建策略”。在新打开的浏览器窗口中，创建将用于您的角色的新策略。

   1. 在“创建策略”页面上，选择 JSON 选项卡。将“先决条件”中显示的 JSON 代码复制到策略编辑器字段中。

1. 如果您希望手动设置**快照保留配置**的值，请选择**自定义设置**。  
![\[显示“启用保留 > 自定义设置”选项的 Apache Iceberg 表详细信息页面。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/table-enable-retention.png)

1. 选中**将选定的 IAM 角色应用于选定的优化器**选项，可将单个 IAM 角色用于所有已启用的优化器。

1. 如果您有安全策略配置，其中 Iceberg 表优化器需要从特定的虚拟私有云（VPC）访问 Amazon S3 存储桶，则请创建 AWS Glue 网络连接或使用现有网络连接。

   如果您尚未设置 AWS Glue VPC 连接，则请使用 AWS Glue 控制台或 AWS CLI/SDK 按照[为连接器创建连接](https://docs.aws.amazon.com/glue/latest/dg/creating-connections.html)部分中的步骤创建一个新连接。

1. 然后在**快照保留配置**下，选择使用 [Iceberg 表配置](https://iceberg.apache.org/docs/1.5.2/configuration/#table-behavior-properties)中指定的值，或者为快照保留期（history.expire.max-snapshot-age-ms）和要保留的最小快照数量（history.expire.min-snapshots-to-keep）指定自定义值，以及连续快照删除作业运行之间的小时数。

1.  选择**删除关联文件**以在表优化器从表元数据中删除较早快照时删除底层文件。

    如果未选中此选项，则在从表元数据中移除较早的快照时，其关联文件将作为孤立文件保留在存储中。

1. 阅读警告声明，然后选择**我确认**以继续操作。
**注意**  
 在 Data Catalog 中，快照保留优化器遵循由分支和标签级别保留策略控制的生命周期。有关更多信息，请参阅 Iceberg 文档中的 [Branching and tagging](https://iceberg.apache.org/docs/latest/branching/#overview) 部分。

1. 检查配置，然后选择**启用优化**。

   等待几分钟，以便保留优化器运行并根据配置使较早的快照过期。

------
#### [ AWS CLI ]

 要在 AWS Glue 中为新 Iceberg 表启用快照保留功能，需要创建一个 `retention` 类型的表优化器，并将 `table-optimizer-configuration` 中的 `enabled` 字段设置为 `true`。您可以使用 AWS CLI 命令 `create-table-optimizer` 或 `update-table-optimizer` 来完成此操作。此外，您需要根据自己的需求指定保留配置字段，例如 `snapshotRetentionPeriodInDays` 和 `numberOfSnapshotsToRetain`。

以下示例演示了启用快照保留优化器的方法。将账户 ID 替换为有效的 AWS 账户 ID。将数据库名称和表名称替换为实际的 Iceberg 表名称和数据库名称。将 `roleArn` 替换为具有运行快照保留优化器所需权限的 IAM 角色的 AWS 资源名称（ARN）和名称。

```
aws glue create-table-optimizer \
  --catalog-id 123456789012 \
  --database-name iceberg_db \
  --table-name iceberg_table \
  --table-optimizer-configuration '{"roleArn":"arn:aws:iam::123456789012:role/optimizer_role","enabled":'true', "vpcConfiguration":{
"glueConnectionName":"glue_connection_name"}, "retentionConfiguration":{"icebergConfiguration":{"snapshotRetentionPeriodInDays":7,"numberOfSnapshotsToRetain":3,"cleanExpiredFiles":'true'}}}'\
  --type retention
```

 此命令会为给定目录、数据库和区域中的指定 Iceberg 表创建保留优化器。table-optimizer-configuration 会指定要使用的 IAM 角色 ARN，启用该优化器并设置保留配置。在此示例中，它会将快照保留 7 天，至少保留 3 个快照，并清理已过期的文件。
+  snapshotRetentionPeriodInDays – 快照过期前将会保留的天数。默认值为 `5`。
+ numberOfSnapshotsToRetain – 要保留的最小快照数量，即使已超过保留期亦不例外。默认值为 `1`。
+ cleanExpiredFiles – 这是一个布尔值，指示是否在快照过期后删除已过期的数据文件。默认值为 `true`。

   如果设置为 true，则会从表的元数据中移除较早的快照，并删除其底层文件。如果将此参数设置为 false，则会从表的元数据中移除较早的快照，但其底层文件仍作为孤立文件保留在存储中。

------
#### [ AWS API ]

调用 [CreateTableOptimizer](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-table-optimizers.html#aws-glue-api-table-optimizers-CreateTableOptimizer) 操作为表启用快照保留优化器。

------

启用压缩后，**表优化**选项卡会显示以下压缩详细信息（大约 15–20 分钟后）：

开始时间  
快照保留优化器启动的时间。该值是一个采用 UTC 时间格式的时间戳。

运行时间  
该时间指示优化器完成任务所花费的时间。该值是一个采用 UTC 时间格式的时间戳。

Status  
优化器运行的状态。值为成功或失败。

已删除数据文件数  
已删除的文件总数。

已删除清单文件数  
已删除的清单文件总数。

已删除清单列表数  
已删除的清单列表总数。

# 更新快照保留优化器
<a name="update-snapshot-retention"></a>

 您可以使用 AWS Glue 控制台、AWS CLI 或 UpdateTableOptimizer API 更新特定 Apache Iceberg 表的现有快照保留优化器配置。

------
#### [ Console ]

**更新快照保留配置**

1. 登录 AWS 管理控制台，然后打开 AWS Glue 控制台，网址为：[https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/)。

1. 选择**数据目录**，然后选择**表**。从表列表中，选择要更新快照保留优化器配置的 Iceberg 表。

1. 在**表详细信息**页面的下半部分，选择**表优化**选项卡，然后选择**编辑**。您还可以从该页面右上角的**操作**菜单中，选择**优化**下的**编辑**。

1.  然后在**编辑优化**页面上，进行所需的更改。

1.  选择**保存**。

------
#### [ AWS CLI ]

 要使用 AWS CLI 更新快照保留优化器，您可以使用以下命令：

```
aws glue update-table-optimizer \
 --catalog-id 123456789012 \
 --database-name iceberg_db \
 --table-name iceberg_table \
 --table-optimizer-configuration '{"roleArn":"arn:aws:iam::123456789012:role/optimizer_role"","enabled":'true', "vpcConfiguration":{"glueConnectionName":"glue_connection_name"},"retentionConfiguration":{"icebergConfiguration":{"snapshotRetentionPeriodInDays":7,"numberOfSnapshotsToRetain":3,"cleanExpiredFiles":'true'}}}' \
 --type retention
```

 此命令会更新给定目录、数据库和区域中指定表的保留配置。关键参数如下：
+  snapshotRetentionPeriodInDays – 快照过期前将会保留的天数。默认值为 `1`。
+ numberOfSnapshotsToRetain – 要保留的最小快照数量，即使已超过保留期亦不例外。默认值为 `5`。
+ cleanExpiredFiles – 这是一个布尔值，指示是否在快照过期后删除已过期的数据文件。默认值为 `true`。

   如果设置为 true，则会从表的元数据中移除较早的快照，并删除其底层文件。如果将此参数设置为 false，则会从表的元数据中移除较早的快照，但其底层文件仍作为孤立文件保留在存储中。

------
#### [ API ]

您可以使用 `UpdateTableOptimizer` API 来更新表优化器。您可以使用此 API 来更新有关压缩、保留或孤立文件删除功能的现有表优化器配置。请求参数包括：
+ catalogId（必填项）：包含该表的目录的 ID 
+  databaseName（可选）：包含该表的数据库的名称 
+  tableName（可选）：该表的名称 
+  type（必填项）：表优化器的类型（压缩、保留或孤立文件删除） 
+  retentionConfiguration（必填项）：更新后的表优化器配置，包括角色 ARN、启用状态、保留配置和孤立文件删除配置。

------

# 禁用快照保留优化器
<a name="disable-snapshot-retention"></a>

 您可以使用 AWS Glue 控制台或 AWS CLI 来为特定的 Apache Iceberg 表禁用快照保留优化器。

------
#### [ Console ]

**禁快照保留功能**

1. 登录 AWS 管理控制台，然后打开 AWS Glue 控制台，网址为：[https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/)。

1. 选择**数据目录**，然后选择**表**。从表列表中，选择要禁用快照保留优化器的表。

1. 在**表详细信息**页面的下半部分，选择**表优化**和**禁用**，并选择**操作**下的**快照保留**。

   您还可以从该页面右上角的**操作**菜单中，选择**优化**下的**禁用**。

1.  在确认消息页面选择**禁用**。您可以在以后重新启用快照保留优化器。

    确认之后，快照保留优化器将被禁用，并且快照保留的状态将恢复为 `Not enabled`。

------
#### [ AWS CLI ]

将以下示例中的账户 ID 替换为有效的 AWS 账户 ID。将数据库名称和表名称替换为实际的 Iceberg 表名称和数据库名称。将 `roleArn` 替换为具有运行保留优化器所需权限的 IAM 角色的 AWS 资源名称（ARN）和实际名称。

```
aws glue update-table-optimizer \
  --catalog-id 123456789012 \
  --database-name iceberg_db \
  --table-name iceberg_table \
  --table-optimizer-configuration '{"roleArn":"arn:aws:iam::123456789012:role/optimizer_role", "vpcConfiguration":{"glueConnectionName":"glue_connection_name"}, "enabled":'false'}'\ 
  --type retention
```

------
#### [ AWS API ]

调用 [UpdateTableOptimizer](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-table-optimizers.html#aws-glue-api-table-optimizers-UpdateTableOptimizer) 操作来为特定的表禁用快照保留优化器。

------

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

 AWS Glue Data Catalog 允许删除 Iceberg 表中的孤立文件。孤立文件是指存在于指定表位置下的 Amazon S3 数据来源中，未被 Iceberg 表元数据跟踪，且超过配置的时效阈值的未引用文件。这些孤立文件可能因压缩、分区删除或表重写等操作失败而不断堆积，占用不必要的存储空间。

AWS Glue 中的孤立文件删除优化器会扫描表元数据和实际数据文件，识别孤立文件，然后将其删除以回收存储空间。优化器仅会删除在优化器创建日期之后创建的且同时符合配置的删除条件的文件。在优化器创建日期之前或之日创建的文件永远不会删除。

**孤立文件删除逻辑**

1. 日期检查：将文件创建日期与优化器创建日期进行比较。如果文件早于或等于优化器创建日期，则会跳过该文件。

1. 优化器配置检查：如果文件晚于优化器创建日期，则根据配置的时效阈值对文件进行评估。如果文件符合删除条件，优化器会将其删除。如果文件不符合条件，则跳过该文件。

 可以通过在 Data Catalog 中创建孤立文件删除表优化器来启动孤立文件删除。

**重要**  
 默认情况下，删除孤立文件会评估整个 AWS Glue 表位置上的文件。虽然可以使用 API 参数配置子前缀来限制评估范围，但必须确保表位置不包含其他数据来源或表的文件。如果您的表位置与其他数据源重叠，服务可能会将不相关的文件识别为孤立文件并删除。

**Topics**
+ [启用孤立文件删除功能](enable-orphan-file-deletion.md)
+ [更新孤立文件删除优化器](update-orphan-file-deletion.md)
+ [禁用孤立文件删除功能](disable-orphan-file-deletion.md)

# 启用孤立文件删除功能
<a name="enable-orphan-file-deletion"></a>

 您可以在 Data Catalog 中使用 AWS Glue 控制台、AWS CLI 或 AWS API 为 Apache Iceberg 表启用孤立文件删除功能。对于新表，您可以在创建表时选择 Apache Iceberg 表格式并启用孤立文件删除优化器。新表会默认禁用快照保留功能。

------
#### [ Console ]

**启用孤立文件删除功能**

1.  打开 AWS Glue 控制台（[https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/)），然后以数据湖管理员、表创建者或已被授予表的 `glue:UpdateTable` 和 `lakeformation:GetDataAccess` 权限的用户身份登录。

1. 在导航窗格的**数据目录**下，请选择**表**。

1. 在**表**页面上，选择要启用孤立文件删除功能的 Iceberg 表。

   选择该页面下半部分的**表优化**选项卡，然后选择**启用**，并从**操作**中选择**孤立文件删除**。

   您还可以从该页面右上角的**操作**菜单中，选择**优化**下的**启用**。

1. 在**启用优化**页面的**优化选项**下，选择**孤立文件删除**。

1. 如果您选择使用**默认设置**，则所有孤立文件将在 3 天后删除。如果要将孤立文件保留特定的天数，请选择**自定义设置**。

1. 然后选择具有删除孤立文件所需权限的 IAM 角色。

1. 如果您有安全策略配置，其中 Iceberg 表优化器需要从特定的虚拟私有云（VPC）访问 Amazon S3 存储桶，则请创建 AWS Glue 网络连接或使用现有网络连接。

   如果您尚未设置 AWS Glue VPC 连接，则请使用 AWS Glue 控制台或 AWS CLI/SDK 按照[为连接器创建连接](https://docs.aws.amazon.com/glue/latest/dg/creating-connections.html)部分中的步骤创建一个新连接。

1. 如果您选择**自定义设置**，请在**孤立文件删除配置**下，输入文件删除之前要保留的天数。您也可以指定两次连续优化器运行的时间间隔。默认值为 24 小时。

1. 选择**启用优化**。

------
#### [ AWS CLI ]

 要在 AWS Glue 中为 Iceberg 表启用孤立文件删除功能，需要创建一个 `orphan_file_deletion` 类型的表优化器并将 `enabled` 字段设置为 true。要使用 AWS CLI 为 Iceberg 表创建孤立文件删除优化器，可以使用以下命令：

```
aws glue create-table-optimizer \
 --catalog-id 123456789012 \
 --database-name iceberg_db \
 --table-name iceberg_table \
 --table-optimizer-configuration '{"roleArn":"arn:aws:iam::123456789012:role/optimizer_role","enabled":true, "vpcConfiguration":{
"glueConnectionName":"glue_connection_name"}, "orphanFileDeletionConfiguration":{"icebergConfiguration":{"orphanFileRetentionPeriodInDays":3, "location":'S3 location'}}}'\
 --type orphan_file_deletion
```

 此命令将为指定的 Iceberg 表创建孤立文件删除优化器。关键参数如下：
+ roleArn – 具有访问 S3 存储桶和 Glue 资源所需权限的 IAM 角色的 ARN。
+ enabled – 设置为 true 将会启用优化器
+ orphanFileRetentionPeriodInDays – 孤立文件删除之前要保留的天数（至少 1 天）。
+ type – 设置为 orphan\$1file\$1deletion 将会创建孤立文件删除优化器。

 该表优化器创建后，将会定期运行孤立文件删除（如果保持启用状态，则会每天删除一次）。您可以使用 `list-table-optimizer-runs` API 来检查运行情况。孤立文件删除作业会识别并删除表的 Iceberg 元数据中未跟踪的文件。

------
#### [ API ]

调用 [CreateTableOptimizer](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-table-optimizers.html#aws-glue-api-table-optimizers-CreateTableOptimizer) 操作可创建特定表的孤立文件删除优化器。

------

# 更新孤立文件删除优化器
<a name="update-orphan-file-deletion"></a>

 您可以使用 AWS Glue 控制台、AWS CLI 或 `UpdateTableOptimizer` 操作来修改孤立文件删除优化器的配置，例如更改孤立文件的保留期或优化器使用的 IAM 角色。

------
#### [ AWS 管理控制台 ]

**更新孤立文件删除优化器**

1.  选择**数据目录**，然后选择**表**。从表列表中，选择要更新孤立文件删除优化器配置的表。

1. 在**表详细信息**页面的下半部分，选择**表优化**，然后选择**编辑**。

1.  然后在**编辑优化**页面上，进行所需的更改。

1.  选择**保存**。

------
#### [ AWS CLI ]

 您可以在 AWS Glue 中使用 `update-table-optimizer` 调用来更新中的孤立文件删除优化器。这让您能够修改 `icebergConfiguration` 字段中的 `OrphanFileDeletionConfiguration`，您可以在该字段中更新 `OrphanFileRetentionPeriodInDays` 以设置孤立文件的保留天数，以及指定要从中删除孤立文件的 Iceberg 表位置。

```
aws glue update-table-optimizer \
 --catalog-id 123456789012 \
 --database-name iceberg_db \
 --table-name Iceberg_table \
 --table-optimizer-configuration '{"roleArn":"arn:aws:iam::123456789012:role/optimizer_role","enabled":true, "vpcConfiguration":{"glueConnectionName":"glue_connection_name"},"orphanFileDeletionConfiguration":{"icebergConfiguration":{"orphanFileRetentionPeriodInDays":5}}}' \
 --type orphan_file_deletion
```

------
#### [ API ]

调用 [UpdateTableOptimizer](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-table-optimizers.html#aws-glue-api-table-optimizers-UpdateTableOptimizer) 操作可更新表的孤立文件删除优化器。

------

 

# 禁用孤立文件删除功能
<a name="disable-orphan-file-deletion"></a>

 您可以使用 AWS Glue 控制台或 AWS CLI 来为特定的 Apache Iceberg 表禁用孤立文件删除优化器。

------
#### [ Console ]

**禁用删除孤立文件功能**

1. 选择**数据目录**，然后选择**表**。从表列表中，选择要禁用孤立文件删除优化器的表。

1. 在**表详细信息**页面的下半部分，选择**表优化**选项卡。

1. 选择**操作**，然后选择**禁用**、**孤立文件删除**。

   您也可以从**操作**菜单中选择**优化**下的**禁用**。

1.  在确认消息页面选择**禁用**。您可以在以后重新启用孤立文件删除优化器。

    确认之后，孤立文件删除优化器将被禁用，并且孤立文件删除的状态将恢复为 `Not enabled`。

------
#### [ AWS CLI ]

将以下示例中的账户 ID 替换为有效的 AWS 账户 ID。将数据库名称和表名称替换为实际的 Iceberg 表名称和数据库名称。将 `roleArn` 替换为具有禁用优化器所需权限的 IAM 角色的 AWS 资源名称（ARN）和实际名称。

```
aws glue update-table-optimizer \
  --catalog-id 123456789012 \
  --database-name iceberg_db \
  --table-name iceberg_table \
  --table-optimizer-configuration '{"roleArn":"arn:aws:iam::123456789012:role/optimizer_role", "enabled":'false'}'\ 
  --type orphan_file_deletion
```

------
#### [ API ]

调用 [UpdateTableOptimizer](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-table-optimizers.html#aws-glue-api-table-optimizers-UpdateTableOptimizer) 操作来为特定的表禁用快照保留优化器。

------

# 查看优化详细信息
<a name="view-optimization-status"></a>

您可以使用 AWS Glue 控制台、AWS CLI 或 AWS API 操作来查看 Apache Iceberg 表的优化状态。

------
#### [ Console ]

**查看 Iceberg 表的优化状态（控制台）**
+ 在 AWS Glue 控制台中，您可以从 **Data Catalog** 下的**表**列表中选择一个 Iceberg 表，从而查看 Iceberg 表的优化状态。在**表优化**下，选择**查看全部**  
![\[同时选中“Apache Iceberg 表详细信息”页面和“启用压缩”选项。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/table-list-compaction-status.png)

------
#### [  AWS CLI  ]

您可以使用 AWS CLI 来查看优化详细信息。

请将以下示例中的账户 ID 替换为有效的 AWS 账户 ID，将数据库名称和表名称替换为实际的 Iceberg 表名称。对于 `type`，请提供优化类型。可接受的值为 `compaction`、`retention` 和 `orphan-file-deletion`。
+ **获取表的上次压缩详细信息**

  ```
  aws get-table-optimizer \
    --catalog-id 123456789012 \
    --database-name iceberg_db \
    --table-name iceberg_table \
    --type compaction
  ```
+ 使用以下示例来检索特定表的优化器历史记录。

  ```
  aws list-table-optimizer-runs \
    --catalog-id 123456789012 \
    --database-name iceberg_db \
    --table-name iceberg_table \
    --type compaction
  ```
+ 以下示例演示了如何检索多个优化器的优化运行和配置详细信息。您最多可以指定 20 个优化器。

  ```
  aws glue batch-get-table-optimizer \
  --entries '[{"catalogId":"123456789012", "databaseName":"iceberg_db", "tableName":"iceberg_table", "type":"compaction"}]'
  ```

------
#### [ API ]
+ 使用 `GetTableOptimizer` 操作检索优化器的上次运行详细信息。
+  使用 `ListTableOptimizerRuns` 操作检索特定表上给定优化器的历史记录。您可以在单个 API 调用中指定 20 个优化器。
+ 使用 [BatchGetTableOptimizer](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-table-optimizers.html#aws-glue-api-table-optimizers-BatchGetTableOptimizer) 操作检索您账户中多个优化器的配置详细信息。

------

# 查看 Amazon CloudWatch 指标
<a name="view-optimization-metrics"></a>

 成功运行表优化器后，服务会创建有关优化作业性能的 Amazon CloudWatch 指标。您可以前往 **CloudWatch 指标**并选择**指标**、**所有指标**。您可以按特定的命名空间（例如 AWS Glue）、表名称或数据库名称筛选指标。

 有关更多信息，请参阅《Amazon CloudWatch 用户指南》中的[查看可用的指标](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/viewing_metrics_with_cloudwatch.html)**。

****压缩****
+ 已压缩的字节数 
+ 已压缩的文件数
+ 分配给作业的 DPU 数 
+ 作业持续时间（小时） 

****快照保留****
+ 已删除的数据文件数 
+ 已删除的清单文件数
+ 已删除的清单列表数 
+ 作业持续时间（小时）

****孤立文件删除****
+ 已删除的孤立文件数 
+ 作业持续时间（小时） 

# 删除优化器
<a name="delete-optimizer"></a>

您可以使用 AWS CLI 或 AWS API 操作来删除表的优化器和关联的元数据。

运行以下 AWS CLI 命令可删除表的优化历史记录。您需要指定优化器 `type` 以及目录 ID、数据库名称和表名等参数。可接受的值为 `compaction`、`retention` 和 `orphan_file_deletion`。

```
aws glue delete-table-optimizer \
  --catalog-id 123456789012 \
  --database-name iceberg_db \
  --table-name iceberg_table \
  --type compaction
```

 使用 `DeleteTableOptimizer` 操作删除表的优化器。

# 注意事项和限制
<a name="optimizer-notes"></a>

 本节包括在 AWS Glue Data Catalog 中使用表优化器时需要考虑的事项。

## 持久性与正确性
<a name="durability-correctness"></a>

**S3 表位置：**

当多个 AWS Glue Data Catalog 表共享同一 Amazon S3 位置并启用优化器时，一个表的快照保留或孤立文件删除优化器可能会删除另一个表仍在引用的文件。确保启用了优化器的每个表都使用不与任何其他表（包括不同数据库中的表）共享的唯一 Amazon S3 位置。

**S3 生命周期过期：**

适用于 Iceberg 表存储位置的 Amazon S3 生命周期过期规则可能会删除活动快照仍在引用的清单和数据文件。如果您的存储桶具有生命周期过期规则，请确保这些规则排除了 Iceberg 表存储路径。

## 托管式数据压缩的支持的格式和限制
<a name="compaction-notes"></a>

数据压缩支持多种用于读取和写入数据的压缩格式，例如从加密表中读取数据。

**并发控制：**

 Apache Iceberg 支持乐观的并发控制，允许多个写入器同时执行操作。冲突在提交时进行检测并解决。使用流式处理管道时，可通过表属性和压缩设置配置适当的重试设置，以有效处理并发写入。有关详细指导，请参阅 AWS 大数据博客中关于[管理 Iceberg 表并发写入](https://aws.amazon.com/blogs/big-data/manage-concurrent-write-conflicts-in-apache-iceberg-on-the-aws-glue-data-catalog/)的文章：

**压缩重试：**

 当压缩操作连续四次失败时，AWS Glue 目录表优化功能会自动暂停优化器，以防止不必要的计算资源消耗。请先查看日志，尝试了解压缩反复失败的原因。要恢复压缩优化，您可以通过 AWS Glue 控制台或 API 重新启用优化器。

 **数据压缩支持：**
+ **加密** – 数据压缩仅支持默认的 Amazon S3 加密（SSE-S3）和服务器端 KMS 加密（SSE-KMS）。
+ **压缩策略**：Binpack、快速排序和 Z 形排序
+ 当存储基础数据的 Amazon S3 存储桶位于另一个账户中时，您可以从数据目录所在的账户运行压缩。要实现此目的，压缩角色需要具有访问 Amazon S3 存储桶的权限。

 **数据压缩目前不支持：**
+ **对跨账户表进行压缩** – 您无法对跨账户表进行压缩。
+ **对跨区域表进行压缩** – 您无法对跨区域表进行压缩。
+ **针对资源链接启用压缩**
+ **Amazon S3 Express One Zone 存储类中的表**：您无法对 Amazon S3 Express One Zone 存储类中的 Iceberg 表运行压缩。
+ **Z 形排序压缩策略不支持以下数据类型：**
  + 十进制
  + TimestampWithoutZone

## 关于快照保留和孤立文件删除优化器的注意事项
<a name="retention-notes"></a>

对于快照保留和孤立文件删除优化器，应注意以下几点。
+ 快照保留和孤立文件删除进程的上限为每次运行删除 1,000,000 个文件。删除已过期的快照时，如果符合删除条件的文件数量超过 1,000,000 个，则超过该阈值的所有剩余文件将继续作为孤立文件存在于表存储中。
+ 只有在满足以下两个条件时，快照保留优化器才会保留快照：要保留的最小快照数量和指定的保留期。
+ 快照保留优化器会从 Apache Iceberg 中删除过期的快照元数据，从而防止对过期快照进行时空旅行查询，并选择性删除关联的数据文件。
+  孤立文件删除优化器会删除 Iceberg 元数据不再引用的孤立数据和元数据文件，前提是它们的创建时间早于优化器运行时设定的孤立文件删除保留期。
+ Apache Iceberg 通过分支和标签促进版本控制，这些分支和标签是指向特定快照状态的指定指针。每个分支和标签都遵循自己独立的生命周期，受其各自级别定义的保留策略的约束。AWS Glue Data Catalog 优化器会考虑这些生命周期策略，确保遵守指定的保留规则。分支和标签级别的保留策略优先于优化器配置。

   有关更多信息，请参阅 Apache Iceberg 文档中的[分支和标签](https://iceberg.apache.org/docs/nightly/branching/)部分。
+ 快照保留和孤立文件删除优化器将根据配置的参数删除符合清理条件的文件。通过在相应的存储桶上实施 S3 版本控制和生命周期策略，增强对文件删除的控制。

   有关设置版本控制和创建生命周期规则的详细说明，请参阅 [https://docs.aws.amazon.com/AmazonS3/latest/userguide/Versioning.html](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Versioning.html)。
+  为了正确判定孤立文件，请确保提供的表位置和任何子路径不与任何其他表或数据来源中的数据重叠，也不包含来自任何其他表或数据来源的数据。如果路径重叠，意外删除文件可能导致无法恢复的数据丢失。

## 调试 OversizedAllocationException 异常
<a name="debug-exception"></a>

要解决 `OversizedAllocationException` 异常，请执行以下操作：
+ 减小向量化读取器的批量大小并进行检查。默认批处理大小为 5000。此设置在 `read.parquet.vectorization.batch-size` 中进行控制。
  + 若多次调整后仍无效，请关闭向量化功能。此设置在 `read.parquet.vectorization.enabled` 中进行控制。

# 表优化器支持的区域
<a name="regions-optimizers"></a>

AWS Glue Data Catalog 的表优化功能（压缩、快照保留和孤立文件删除）在以下 AWS 区域中可用：
+ 亚太地区（东京）
+ 亚太地区（首尔）
+ 亚太地区（孟买）
+ 亚太地区（新加坡）
+ 亚太地区（悉尼）
+ 亚太地区（雅加达）
+ 加拿大 (中部)
+ 欧洲地区（爱尔兰）
+ 欧洲地区（伦敦）
+ 欧洲地区（法兰克福）
+ 欧洲地区（斯德哥尔摩）
+ 美国东部（弗吉尼亚州北部）
+ 美国东部（俄亥俄州）
+ 美国西部（俄勒冈州）
+ 南美洲（圣保罗）

# 优化 Iceberg 表的查询性能
<a name="iceberg-column-statistics"></a>

Apache Iceberg 是一种面向超大型分析数据集的高性能开放表格式。AWS Glue 支持计算和更新 Iceberg 表中每列的不重复值（NDV）数量。借助这些统计数据，可以为处理大型数据集的数据工程师和科学家提供更好的查询优化、数据管理和性能效率。

 AWS Glue 会估算 Iceberg 表中每列的不重复值数量，并在 Amazon S3 中将结果存储与 Iceberg 表快照关联的 [Puffin](https://iceberg.apache.org/puffin-spec/) 文件中。Puffin 是一种 Iceberg 文件格式，专用于存储索引、统计数据和草图等元数据。通过将草图存储在与快照关联的 Puffin 文件中，可确保事务处理的一致性和 NDV 统计数据的新鲜度。

您可以使用 AWS Glue 控制台或 AWS CLI 来配置运行列统计数据生成任务。启动该进程时，AWS Glue 将在后台启动一个 Spark 作业并更新 Data Catalog 中的 AWS Glue 表元数据。您可以使用 AWS Glue 控制台、AWS CLI 或通过调用 [GetColumnStatisticsForTable](https://docs.aws.amazon.com/glue/latest/webapi/API_GetColumnStatisticsForTable.html) API 操作来查看列统计数据。

**注意**  
如果使用 AWS Lake Formation 权限来控制对表的访问权限，则列统计数据任务代入的角色需要拥有表的完全访问权限才能生成统计数据。

**Topics**
+ [生成列统计数据的先决条件](iceberg-column-stats-prereqs.md)
+ [为 Iceberg 表生成列统计数据](iceberg-generate-column-stats.md)
+ [另请参阅](#see-also-iceberg-stats)

# 生成列统计数据的先决条件
<a name="iceberg-column-stats-prereqs"></a>

要生成或更新 Iceberg 表的列统计数据，统计数据生成任务将代表您代入一个 AWS Identity and Access Management（IAM）角色。根据向该角色授予的权限，列统计数据生成任务可以读取 Amazon S3 数据存储中的数据。

配置列统计数据生成任务时，AWS Glue 允许您创建包含 `AWSGlueServiceRole` AWS 托管式策略以及指定数据源所需内联策略的角色。

如果您指定将某个现有的角色用于生成列统计数据，请确保该角色包含 `AWSGlueServiceRole` 策略或等效策略（或此策略的范围缩小版本），以及所需的内联策略。

有关所需权限的更多信息，请参阅 [生成列统计数据的先决条件](column-stats-prereqs.md)。

# 为 Iceberg 表生成列统计数据
<a name="iceberg-generate-column-stats"></a>

使用 AWS Glue 控制台或 AWS CLI 或通过运行 **StartColumnStatisticsTaskRun** 操作，按照以下步骤配置在 Data Catalog 中生成统计数据的计划。

**生成列统计数据**

1. 通过以下网址登录到 AWS Glue 控制台：[https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/)。

1. 选择 Data Catalog 下的**表**。

1. 从列表中选择一个 Iceberg 表。

1. 在**操作**菜单下依次选择**列统计数据**、**按需生成**。

   您也可以选择**表**页面下半部分的**列统计数据**选项卡，然后选择**生成统计数据**按钮。

1. 在**生成统计数据**页面上，提供统计数据生成详细信息。按照[按计划生成列统计数据](generate-column-stats.md)部分中的第 6-11 步操作，为 Iceberg 表配置统计数据生成计划。

   您也可以按照[按需生成列统计数据](column-stats-on-demand.md)中的说明操作，选择按需生成列统计数据
**注意**  
Iceberg 表不支持采样选项。

   AWS Glue 会计算该 Iceberg 表中每列的不重复值的数量，并放入提交到您的 Amazon S3 位置中指定快照 ID 的新 Puffin 文件。

## 另请参阅
<a name="see-also-iceberg-stats"></a>
+ [查看列统计数据](view-column-stats.md)
+ [查看列统计数据任务运行](view-stats-run.md)
+ [停止列统计数据任务运行](stop-stats-run.md)
+ [删除列统计数据](delete-column-stats.md)