

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

# 在 Iceberg 中工作 AWS Glue
<a name="iceberg-glue"></a>

[AWS Glue](https://aws.amazon.com/glue/)是一项无服务器数据集成服务，可以更轻松地发现、准备、移动和集成来自多个来源的数据，用于分析、机器学习 (ML) 和应用程序开发。的核心功能之一 AWS Glue 是它能够以简单且经济实惠的方式执行提取、转换和加载 (ETL) 操作。这有助于对数据进行分类、清理、丰富数据，并在各种数据存储和数据流之间可靠地移动数据。 

[AWS Glue 作业](https://docs.aws.amazon.com/glue/latest/dg/etl-jobs-section.html)使用 [Apache Spark 或 Pyth](https://spark.apache.org/) on 运行时封装定义转换逻辑的脚本。 AWS Glue 作业既可以在批处理模式下运行，也可以在流式传输模式下运行。 

在中创建 Iceberg 作业时 AWS Glue，根据的版本 AWS Glue，您可以使用原生 Iceberg 集成或自定义 Iceberg 版本将 Iceberg 依赖项附加到该作业。

## 使用原生 Iceberg 集成
<a name="glue-native-integration"></a>

AWS Glue 3.0、4.0 和 5.0 版本原生支持事务性数据湖格式，例如 Spark 中的 Apache Iceberg、Apache Hudi 和 Linux Foundation Delta Lake。 AWS Glue 此集成功能简化了开始在中使用这些框架所需的配置步骤 AWS Glue。

要为您的 AWS Glue 作业启用 Iceberg 支持，请设置作业：为您的** AWS Glue 作业选择任务详细信息**选项卡，滚动到 “**高级属性**” 下的 “**作业参数**”，然后将密钥设置为，其值设置为`iceberg`。`--datalake-formats`

如果您使用笔记本创作作业，则可以使用以下`%%configure`魔术在第一个笔记本单元格中配置参数：

```
%%configure
{
  "--conf" : <job-specific Spark configuration discussed later>,
  "--datalake-formats" : "iceberg"
}
```

`--datalake-formats`中的`iceberg`配置对 AWS Glue 应于基于您的版本的特定 Iceberg AWS Glue 版本：


| AWS Glue 版本 | 默认 Iceberg 版本 | 
| --- | --- | 
| 5.0 | 1.7.1 | 
| 4.0 | 1.0.0 | 
| 3.0 | 0.13.1 | 

## 使用自定义 Iceberg 版本
<a name="glue-custom-integration"></a>

在某些情况下，您可能需要保留对任务的 Iceberg 版本的控制权，并按照自己的节奏对其进行升级。例如，升级到更高版本可以解锁对新功能和性能增强的访问权限。要将特定的 Iceberg 版本与一起使用 AWS Glue，您可以提供自己的 JAR 文件。

在实现自定义 Iceberg 版本之前，请查看 AWS Glue 文档的[AWS Glue 版本](https://docs.aws.amazon.com/glue/latest/dg/release-notes.html)部分，以验证与您的 AWS Glue 环境的兼容性。例如， AWS Glue 5.0 需要与 Spark 3.5.4 兼容。

例如，要运行使用 Iceberg 版本 1.9.1 的 AWS Glue 作业，请按照以下步骤操作：

1. 获取所需的 JAR 文件并将其上传到亚马逊 S3：

   1. [从 Apache Maven 存储库中下载 [iceberg-spark-runtime-3.5\_2.12-1.9.1.jar 和-1.9.1.j](https://mvnrepository.com/artifact/org.apache.iceberg/iceberg-spark-runtime-3.5_2.12/1.9.1) ar。iceberg-aws-bundle](https://mvnrepository.com/artifact/org.apache.iceberg/iceberg-aws-bundle/1.9.1)

   1. 将这些文件上传到您指定的 S3 存储桶位置（例如`s3://your-bucket-name/jars/`）。

1. 按如下方式为 AWS Glue 作业设置作业参数：

   1. 在`--extra-jars`参数中指定两个 JAR 文件的完整 S3 路径，用逗号分隔它们（例如，`s3://your-bucket-name/jars/iceberg-spark-runtime-3.5_2.12-1.9.1.jar,s3://your-bucket-name/jars/iceberg-aws-bundle-1.9.1.jar`）。

   1. 请勿包含 `iceberg` 作为 `--datalake-formats` 参数的值。

   1. 如果您使用 AWS Glue 5.0，则必须将`--user-jars-first`参数设置为`true`。

## Iceberg 的 Spark 配置 AWS Glue
<a name="glue-spark-config"></a>

本节讨论为 Iceberg 数据集创作 AWS Glue ETL 作业所需的 Spark 配置。 您可以使用 `--conf` Spark 密钥以及以逗号分隔的所有 Spark 配置键和值列表来设置这些配置。你可以使用笔记本中的`%%configure`魔法，也可以使用 AWS Glue Studio 控制台的 **Job 参数**部分。

```
%glue_version 5.0

%%configure
{
  "--conf" : "spark.sql.extensions=org.apache.iceberg.spark.extensions...",
  "--datalake-formats" : "iceberg"
}
```

使用以下属性配置 Spark 会话：
+ `<catalog_name>`是你的 Iceberg Spark 会话目录名称的名称。将其替换为您选择的名称，并记得更改与该目录关联的所有配置中的引用。在您的代码中，您可以使用完全限定的表名（包括 Spark 会话目录名称）来引用 Iceberg 表，如下所示：

  `<catalog_name>.<database_name>.<table_name>`

  或者，您可以将默认目录更改为通过设置`spark.sql.defaultCatalog`目录名称来定义的 Iceberg 目录。您可以使用第二种方法来引用不带目录前缀的表，这样可以简化查询。
+ `<catalog_name>.<warehouse>`指向您要存储数据和元数据的 Amazon S3 路径。
+ 要使目录成为 AWS Glue Data Catalog，请将设置`spark.sql.catalog.<catalog_name>.type`为`glue`。对于任何自定义目录实现，都需要使用此密钥来指向实现类。有关 Iceberg 支持的目录，请参阅本指南后面的 “[一般最佳实践](best-practices.md)” 部分。

例如，如果您有一个名为的目录`glue_iceberg`，则可以使用多个`--conf`密钥配置作业，如下所示：

```
%%configure
{
  "--datalake-formats" : "iceberg",
  "--conf" : "spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions --conf spark.sql.catalog.glue_iceberg=org.apache.iceberg.spark.SparkCatalog --conf spark.sql.catalog.glue_iceberg.warehouse=s3://<your-warehouse-dir>/ --conf spark.sql.catalog.glue_iceberg.type=glue"
}
```

或者，您可以使用代码将上述配置添加到 Spark 脚本中，如下所示：

```
spark = SparkSession.builder\
                    .config("spark.sql.extensions","org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions")\
                    .config("spark.sql.catalog.glue_iceberg", "org.apache.iceberg.spark.SparkCatalog")\
                    .config("spark.sql.catalog.glue_iceberg.warehouse","s3://<your-warehouse-dir>/")\
                    .config("spark.sql.catalog.glue_iceberg.type", "glue") \
                    .getOrCreate()
```

## AWS Glue 工作最佳实践
<a name="glue-best-practices"></a>

本节提供了调整 Spark 作业 AWS Glue 以优化 Iceberg 表中数据的读取和写入的一般指南。有关 Iceberg 特定的最佳实践，请参阅本指南后面的 “[最佳实践](best-practices.md)” 部分。
+ **尽可能使用最新版本 AWS Glue 并进行升级** — 新版本 AWS Glue 提供性能改进、启动时间缩短和新功能。它们还支持最新的 Iceberg 版本可能需要的较新 Spark 版本。有关可用 AWS Glue 版本及其支持的 Spark 版本的列表，请参阅[AWS Glue 文档](https://docs.aws.amazon.com/glue/latest/dg/release-notes.html)。
+ **优化 AWS Glue 作业内存**-按照 AWS 博客文章 “[优化内存管理” 中的](https://aws.amazon.com/blogs/big-data/optimize-memory-management-in-aws-glue/)建议进行操作 AWS Glue。
+ **使用 AWS Glue Auto Scaling** — 启用 Auto Scaling 时， AWS Glue 会根据您的工作负载自动动态调整 AWS Glue 工作人员的数量。这有助于降低高峰负荷期间 AWS Glue 的工作成本，因为当工作量较小且员工处于闲置状态时，可以 AWS Glue 缩减员工人数。要使用 AWS Glue Auto Scaling，您需要指定 AWS Glue 任务可以扩展到的最大工作人员数量。有关更多信息，请参阅 AWS Glue 文档AWS Glue 中的[使用 auto sc](https://docs.aws.amazon.com/glue/latest/dg/auto-scaling.html) aling。
+ **使用所需的 Iceberg 版本** — Iceberg AWS Glue 的原生集成最适合入门 Iceberg。但是，对于生产工作负载，我们建议您添加库依赖项（如[本指南前面](#glue-custom-integration)所述），以完全控制 Iceberg 版本。这种方法可以帮助您在 AWS Glue 工作中受益于最新的 Iceberg 功能和性能改进。
+ **启用 Spark 用户界面进行监控和调试** — 您还可以使用[中的 Spark 用户界面 AWS Glue](https://docs.aws.amazon.com/glue/latest/dg/monitor-spark-ui.html)来检查 Iceberg 作业，方法是在有向无环图 (DAG) 中可视化 Spark 作业的不同阶段并详细监控作业。Spark UI 提供了一种有效的方法来进行故障排除和优化 Iceberg 作业。例如，您可以识别具有大量洗牌或磁盘溢出的瓶颈阶段，以确定调整机会。有关更多信息，请参阅 AWS Glue 文档中的[使用 Apache Spark 网页用户界面监控作业](https://docs.aws.amazon.com/glue/latest/dg/monitor-spark-ui.html)。