

# 启用压缩优化器
<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  
压缩运行的状态。值为成功或失败。

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

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