

# 在本地开发和测试 AWS Glue 作业脚本
<a name="aws-glue-programming-etl-libraries"></a>

当您开发和测试 AWS Glue for Spark 作业脚本时，有多种可用选项：
+ AWS Glue Studio 控制台
  + 可视化编辑器
  + 脚本编辑器
  + AWS Glue Studio 笔记本
+ 交互式会话
  + Jupyter notebook
+ Docker 映像
  + 本地开发
  + 远程开发

您可以根据您的要求选择以上任何选项。

如果您喜欢无代码或低代码体验，则 AWS Glue Studio 可视化编辑器是不错的选择。

如果您更喜欢交互式笔记本体验，则 AWS Glue Studio 笔记本是一个不错的选择。有关更多信息，请参阅[将笔记本与 AWS Glue Studio 和 AWS Glue 结合使用](https://docs.aws.amazon.com/glue/latest/ug/notebooks-chapter.html)。如果您想使用您自己的本地环境，交互式会话是一个不错的选择。有关更多信息，请参阅[将交互式会话与 AWS Glue 结合使用](https://docs.aws.amazon.com/glue/latest/dg/interactive-sessions-chapter.html)。

如果您更喜欢本地/远程开发体验，Docker 镜像是一个不错的选择。这可以帮助您在任何您喜欢的地方开发和测试 AWS Glue for Spark 作业脚本，而不会产生 AWS Glue 成本。

如果您更喜欢没有 Docker 的本地开发，则在本地安装 AWS Glue ETL 库目录是一个不错的选择。

## 使用 AWS Glue Studio 进行开发
<a name="develop-using-studio"></a>

AWS Glue Studio 可视化编辑器是一个图形界面，可以方便地在 AWS Glue 中创建、运行和监控提取、转换和加载 (ETL) 任务。您可以直观地编写数据转换工作流，并在 AWS Glue 的基于 Apache Spark 的无服务器 ETL 引擎上无缝运行它们。您可以在任务的每个步骤中检查架构和数据结果。有关更多信息，请参阅《[AWS Glue Studio 用户指南](https://docs.aws.amazon.com/glue/latest/ug/what-is-glue-studio.html)》。

## 使用交互式会话进行开发
<a name="develop-using-interactive-sessions"></a>

交互式会话使您可以在自己选择的环境中构建和测试应用程序。有关更多信息，请参阅[将交互式会话与 AWS Glue 结合使用](https://docs.aws.amazon.com/glue/latest/dg/interactive-sessions-chapter.html)。

# 使用 Docker 映像在本地开发和测试 AWS Glue 作业
<a name="develop-local-docker-image"></a>

 对于生产就绪型数据平台，AWS Glue 任务的开发过程和 CI/CD 管道是一个关键主题。您可以在 Docker 容器中灵活地开发和测试 AWS Glue 作业。AWS Glue 在 Docker Hub 上托管 Docker 映像，以使用其他实用程序设置开发环境。您可以使用首选 IDE、笔记本或使用 AWS Glue ETL 库的 REPL。本主题介绍如何使用 Docker 映像在 Docker 容器中开发和测试 AWS Glue 版本 5.0 作业。

## 可用的 Docker 映像
<a name="develop-local-available-docker-images-ecr"></a>

 以下 Docker 映像可用于 [Amazon ECR](https://gallery.ecr.aws/glue/aws-glue-libs) 上的 AWS Glue：
+  对于 AWS Glue 版本 5.0：`public.ecr.aws/glue/aws-glue-libs:5`
+ 对于 AWS Glue 版本 4.0：`public.ecr.aws/glue/aws-glue-libs:glue_libs_4.0.0_image_01`
+ 对于 AWS Glue 版本 3.0：`public.ecr.aws/glue/aws-glue-libs:glue_libs_3.0.0_image_01`
+ 对于 `public.ecr.aws/glue/aws-glue-libs:glue_libs_2.0.0_image_01` 版本 2.0：AWS Glue

**注意**  
 AWS Glue Docker 映像与 x86\$164 和 arm64 兼容。

 在本示例中，我们使用了 `public.ecr.aws/glue/aws-glue-libs:5`，并在本地计算机上运行容器（Mac、Windows 或 Linux）。此容器映像已经过 AWS Glue 版本 5.0 Spark 作业测试。此映像包含以下内容：
+  Amazon Linux 2023 
+  AWS Glue ETL 库 
+  Apache Spark 3.5.4 
+  开放表格式库：Apache Iceberg 1.7.1、Apache Hudi 0.15.0 和 Delta Lake 3.3.0 
+  AWS Glue Data Catalog 客户端 
+  适用于 Apache Spark 的 Amazon Redshift 连接器 
+  适用于 Apache Hadoop 的 Amazon DynamoDB 连接器 

 要设置自己的容器，请从 ECR Public Gallery 中拉取映像，然后运行该容器。本主题演示如何根据您的要求，使用下列方法运行容器：
+ `spark-submit`
+ REPL shell `(pyspark)`
+ `pytest`
+ Visual Studio Code

## 先决条件
<a name="develop-local-docker-image-prereq"></a>

在开始之前，请确保已安装 Docker 并且 Docker 守护进程正在运行。有关安装说明，请参阅 [Mac](https://docs.docker.com/docker-for-mac/install/) 或 [Linux](https://docs.docker.com/engine/install/) 的 Docker 文档。运行 Docker 的计算机托管 AWS Glue 容器。另外，请确保运行 Docker 的主机上的镜像至少有 7GB 的磁盘空间。

 有关在本地开发 AWS Glue 代码时的限制的更多信息，请参阅[本地开发限制](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-libraries.html#local-dev-restrictions)。

### 配置 AWS
<a name="develop-local-docker-image-config-aws-credentials"></a>

要从容器启用 AWS API 调用，请按照以下步骤设置 AWS 凭证。在以下部分中，我们将使用此 AWS 命名配置文件。

1.  [创建 AWS 命名配置文件](https://docs.aws.amazon.com//cli/latest/userguide/cli-configure-files.html)。

1.  打开 Windows 上的 `cmd` 或 Mac/Linux 上的终端，并在终端中运行以下命令：

   ```
   PROFILE_NAME="<your_profile_name>"
   ```

在以下部分中，我们将使用此 AWS 命名配置文件。

### 
<a name="develop-local-docker-pull-image-from-ecr-public"></a>

 如果您在 Windows 上运行 Docker，请选择 Docker 图标（右键单击），然后在拉取映像之前选择**切换到 Linux 容器**。

请运行以下命令从 ECR Public 中拉取映像：

```
docker pull public.ecr.aws/glue/aws-glue-libs:5 
```

## 运行容器
<a name="develop-local-docker-image-setup-run"></a>

您现在可以使用此镜像运行容器。您可以根据您的要求选择以下任何选项。

### spark-submit
<a name="develop-local-docker-image-setup-run-spark-submit"></a>

您可以通过在容器上运行 `spark-submit` 命令来运行 AWS Glue 任务脚本。

1.  编写脚本并将其作为 `sample.py` 保存在以下示例中，然后使用以下命令将其保存在 `/local_path_to_workspace/src/` 目录下：

   ```
   $ WORKSPACE_LOCATION=/local_path_to_workspace
   $ SCRIPT_FILE_NAME=sample.py
   $ mkdir -p ${WORKSPACE_LOCATION}/src
   $ vim ${WORKSPACE_LOCATION}/src/${SCRIPT_FILE_NAME}
   ```

1.  这些变量用于下面的 docker run 命令。下面 spark-submit 命令中使用的示例代码 (sample.py) 包含在本主题末尾的附录里。

    运行以下命令以在容器上执行 `spark-submit` 命令，以提交新的 Spark 应用程序：

   ```
   $ docker run -it --rm \
       -v ~/.aws:/home
       /hadoop/.aws \
       -v $WORKSPACE_LOCATION:/home/hadoop/workspace/ \
       -e AWS_PROFILE=$PROFILE_NAME \
       --name glue5_spark_submit \
       public.ecr.aws/glue/aws-glue-libs:5 \
       spark-submit /home/hadoop/workspace/src/$SCRIPT_FILE_NAME
   ```

1. （可选）配置 `spark-submit` 以匹配您的环境。例如，您可以将依赖关系与 `--jars` 配置一起传递。有关更多信息，请参阅 Spark 文档中的 [Dynamically Loading Spark Properties](https://spark.apache.org/docs/latest/configuration.html)。

### REPL shell（Pyspark）
<a name="develop-local-docker-image-setup-run-repl-shell"></a>

 您可以运行 REPL (`read-eval-print loops`) shell 进行交互式开发。运行以下命令在容器上执行 PySpark 命令以启动 REPL shell：

```
$ docker run -it --rm \
    -v ~/.aws:/home/hadoop/.aws \
    -e AWS_PROFILE=$PROFILE_NAME \
    --name glue5_pyspark \
    public.ecr.aws/glue/aws-glue-libs:5 \
    pyspark
```

 输出内容如下所示：

```
Python 3.11.6 (main, Jan  9 2025, 00:00:00) [GCC 11.4.1 20230605 (Red Hat 11.4.1-2)] on linux
Type "help", "copyright", "credits" or "license" for more information.
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /__ / .__/\_,_/_/ /_/\_\   version 3.5.4-amzn-0
      /_/

Using Python version 3.11.6 (main, Jan  9 2025 00:00:00)
Spark context Web UI available at None
Spark context available as 'sc' (master = local[*], app id = local-1740643079929).
SparkSession available as 'spark'.
>>>
```

 有此 REPL shell，便能以交互方式进行编码和测试。

### Pytest
<a name="develop-local-docker-image-setup-run-pytest"></a>

 若要进行单元测试，可将 `pytest` 用于 AWS Glue Spark 作业脚本。运行以下命令进行准备。

```
$ WORKSPACE_LOCATION=/local_path_to_workspace
$ SCRIPT_FILE_NAME=sample.py
$ UNIT_TEST_FILE_NAME=test_sample.py
$ mkdir -p ${WORKSPACE_LOCATION}/tests
$ vim ${WORKSPACE_LOCATION}/tests/${UNIT_TEST_FILE_NAME}
```

 使用 `docker run` 运行以下命令来运行 `pytest`：

```
$ docker run -i --rm \
    -v ~/.aws:/home/hadoop/.aws \
    -v $WORKSPACE_LOCATION:/home/hadoop/workspace/ \
    --workdir /home/hadoop/workspace \
    -e AWS_PROFILE=$PROFILE_NAME \
    --name glue5_pytest \
    public.ecr.aws/glue/aws-glue-libs:5 \
    -c "python3 -m pytest --disable-warnings"
```

 在 `pytest` 执行完单元测试后，输出内容如下所示：

```
============================= test session starts ==============================
platform linux -- Python 3.11.6, pytest-8.3.4, pluggy-1.5.0
rootdir: /home/hadoop/workspace
plugins: integration-mark-0.2.0
collected 1 item

tests/test_sample.py .                                                   [100%]

======================== 1 passed, 1 warning in 34.28s =========================
```

### 将容器设置为使用 Visual Studio 代码
<a name="develop-local-docker-image-setup-visual-studio"></a>

 要使用 Visual Studio Code 设置容器，请完成以下步骤：

1. 安装 Visual Studio 代码。

1. 安装 [Python](https://marketplace.visualstudio.com/items?itemName=ms-python.python)。

1. 安装 [Visual Studio Code Remote - 容器](https://code.visualstudio.com/docs/remote/containers)

1. 在 Visual Studio 代码中打开工作区文件夹。

1. 按 `Ctrl+Shift+P`（Windows/Linux）或 `Cmd+Shift+P`（Mac）。

1. 键入 `Preferences: Open Workspace Settings (JSON)`。

1. 按 Enter。

1. 粘贴以下 JSON 并保存它。

   ```
   {
       "python.defaultInterpreterPath": "/usr/bin/python3.11",
       "python.analysis.extraPaths": [
           "/usr/lib/spark/python/lib/py4j-0.10.9.7-src.zip:/usr/lib/spark/python/:/usr/lib/spark/python/lib/",
       ]
   }
   ```

 要设置容器，请按如下步骤操作：

1. 运行 Docker 容器。

   ```
   $ docker run -it --rm \
       -v ~/.aws:/home/hadoop/.aws \
       -v $WORKSPACE_LOCATION:/home/hadoop/workspace/ \
       -e AWS_PROFILE=$PROFILE_NAME \
       --name glue5_pyspark \
       public.ecr.aws/glue/aws-glue-libs:5 \
       pyspark
   ```

1. 启动 Visual Studio 代码。

1.  请选择左侧菜单中的 **Remote Explorer**，然后选择 `amazon/aws-glue-libs:glue_libs_4.0.0_image_01`。

1.  右键单击，然后选择**在当前窗口中附加**。  
![\[右键单击时，会出现一个带“在当前窗口中附加”选项的窗口。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/vs-code-other-containers.png)

1.  如果出现以下对话框，请选择**知道了**。  
![\[带“附加到容器可能会执行任意代码”消息的窗口警告。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/vs-code-warning-got-it.png)

1. 打开 `/home/handoop/workspace/`。  
![\[带“工作空间”选项的窗口下拉列表会突出显示。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/vs-code-open-workspace.png)

1.  创建 AWS Glue PySpark 脚本，然后选择**运行**。

   您将看到脚本成功运行。  
![\[脚本成功运行。\]](http://docs.aws.amazon.com/zh_cn/glue/latest/dg/images/vs-code-run-successful-script.png)

## AWS Glue 4.0 和 AWS Glue 5.0 Docker 映像之间的更改
<a name="develop-local-docker-glue4-glue5-changes"></a>

 AWS Glue 4.0 和 AWS Glue 5.0 Docker 映像之间的主要更改：
+  在 AWS Glue 5.0 中，批处理和流式处理作业都有一个容器映像。这与 Glue 4.0 不同，Glue 4.0 中有一个映像用于批处理，另一个映像用于流式处理。
+  在 AWS Glue 5.0 中，容器的默认用户名为 `hadoop`。在 AWS Glue 4.0 中，默认用户名为 `glue_user`。
+  在 AWS Glue 5.0 中，映像中已删除其他几个库，包括 JupyterLab 和 Livy。但可以手动安装这些库。
+  在 AWS Glue 5.0 中，所有 Iceberg、Hudi 和 Delta 库都是默认预加载，不再需要环境变量 `DATALAKE_FORMATS`。在 AWS Glue 4.0 之前，环境变量 `DATALAKE_FORMATS` 用于指定应加载哪些特定表格式。

 上述列表与 Docker 映像相关。要了解有关 AWS Glue 5.0 更新的更多信息，请参阅 [Introducing AWS Glue 5.0 for Apache Spark](https://aws.amazon.com/blogs/big-data/introducing-aws-glue-5-0-for-apache-spark/) 和[将 AWS Glue for Spark 作业迁移到 AWS Glue 版本 5.0](https://docs.aws.amazon.com/glue/latest/dg/migrating-version-50.html)。

## 注意事项
<a name="develop-local-docker-considerations"></a>

 请记住，使用 AWS Glue 容器映像在本地开发作业脚本时，不支持以下功能。
+  [作业书签](https://docs.aws.amazon.com/glue/latest/dg/monitor-continuations.html) 
+  AWS Glue Parquet 写入器（[在 AWS Glue 中使用 Parquet 格式](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-format-parquet-home.html)） 
+  [FillMissingValues 转换](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-crawler-pyspark-transforms-fillmissingvalues.html) 
+  [FindMatches 转换](https://docs.aws.amazon.com/glue/latest/dg/machine-learning.html#find-matches-transform) 
+  [矢量化 SIMD CSV 读取器](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-format-csv-home.html#aws-glue-programming-etl-format-simd-csv-reader) 
+  用于从 Amazon S3 路径加载 JDBC 驱动程序的属性 [customJdbcDriverS3Path](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-connect.html#aws-glue-programming-etl-connect-jdbc) 
+  [AWS Glue 数据质量自动监测功能](https://docs.aws.amazon.com/glue/latest/dg/glue-data-quality.html) 
+  [敏感数据检测](https://docs.aws.amazon.com/glue/latest/dg/detect-PII.html) 
+  AWS Lake Formation 基于权限的凭证售卖 

## 附录：添加 JDBC 驱动程序和 Java 库
<a name="develop-local-docker-image-appendix"></a>

 要添加容器中当前不可用的 JDBC 驱动程序，可以在工作空间下创建包含所需 JAR 文件的新目录，然后在 docker run 命令中将该目录挂载到 `/opt/spark/jars/`。在容器内的 `/opt/spark/jars/` 下找到的 JAR 文件会自动添加到 Spark Classpath 中，并可在作业运行期间使用。

 例如，使用以下 docker run 命令将 JDBC 驱动程序 jar 添加到 PySpark REPL shell 中。

```
docker run -it --rm \
    -v ~/.aws:/home/hadoop/.aws \
    -v $WORKSPACE_LOCATION:/home/hadoop/workspace/ \
    -v $WORKSPACE_LOCATION/jars/:/opt/spark/jars/ \
    --workdir /home/hadoop/workspace \
    -e AWS_PROFILE=$PROFILE_NAME \
    --name glue5_jdbc \
    public.ecr.aws/glue/aws-glue-libs:5 \
    pyspark
```

 正如**注意事项**中强调的那样，`customJdbcDriverS3Path` 连接选项不能用于在 AWS Glue 容器映像中从 Amazon S3 导入自定义 JDBC 驱动程序。