在本地开发和测试 Amazon Glue 作业脚本
当您开发和测试 Amazon Glue for Spark 作业脚本时,有多种可用选项:
Amazon Glue Studio 控制台
可视化编辑器
脚本编辑器
Amazon Glue Studio 笔记本
交互式会话
Jupyter notebook
Docker 映像
本地开发
远程开发
您可以根据您的要求选择以上任何选项。
如果您喜欢无代码或低代码体验,则 Amazon Glue Studio 可视化编辑器是不错的选择。
如果您更喜欢交互式笔记本体验,则 Amazon Glue Studio 笔记本是一个不错的选择。有关更多信息,请参阅将笔记本与 Amazon Glue Studio 和 Amazon Glue 结合使用。如果您想使用您自己的本地环境,交互式会话是一个不错的选择。有关更多信息,请参阅将交互式会话与 Amazon Glue 结合使用。
如果您更喜欢本地/远程开发体验,Docker 镜像是一个不错的选择。这可以帮助您在任何您喜欢的地方开发和测试 Amazon Glue for Spark 作业脚本,而不会产生 Amazon Glue 成本。
如果您更喜欢没有 Docker 的本地开发,则在本地安装 Amazon Glue ETL 库目录是一个不错的选择。
使用 Amazon Glue Studio 进行开发
Amazon Glue Studio 可视化编辑器是一个图形界面,可以方便地在 Amazon Glue 中创建、运行和监控提取、转换和加载 (ETL) 任务。您可以直观地编写数据转换工作流,并在 Amazon Glue 的基于 Apache Spark 的无服务器 ETL 引擎上无缝运行它们。您可以在任务的每个步骤中检查架构和数据结果。有关更多信息,请参阅《Amazon Glue Studio 用户指南》。
使用交互式会话进行开发
交互式会话使您可以在自己选择的环境中构建和测试应用程序。有关更多信息,请参阅将交互式会话与 Amazon Glue 结合使用。
使用 Docker 映像在本地开发和测试 Amazon Glue 作业
对于生产就绪型数据平台,Amazon Glue 任务的开发过程和 CI/CD 管道是一个关键主题。您可以在 Docker 容器中灵活地开发和测试 Amazon Glue 作业。Amazon Glue 在 Docker Hub 上托管 Docker 映像,以使用其他实用程序设置开发环境。您可以使用首选 IDE、笔记本或使用 Amazon Glue ETL 库的 REPL。本主题介绍如何使用 Docker 映像在 Docker 容器中开发和测试 Amazon Glue 版本 5.0 作业。
可用的 Docker 映像
以下 Docker 映像可用于 Amazon ECR
-
对于 Amazon Glue 版本 5.0:
public.ecr.aws/glue/aws-glue-libs:5
-
对于 Amazon Glue 版本 4.0:
public.ecr.aws/glue/aws-glue-libs:glue_libs_4.0.0_image_01
-
对于 Amazon 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:Amazon Glue
注意
Amazon Glue Docker 映像与 x86_64 和 arm64 兼容。
在本示例中,我们使用了 public.ecr.aws/glue/aws-glue-libs:5
,并在本地计算机上运行容器(Mac、Windows 或 Linux)。此容器映像已经过 Amazon Glue 版本 5.0 Spark 作业测试。此映像包含以下内容:
-
Amazon Linux 2023
-
Amazon Glue ETL 库
-
Apache Spark 3.5.4
-
开放表格式库:Apache Iceberg 1.7.1、Apache Hudi 0.15.0 和 Delta Lake 3.3.0
-
Amazon Glue Data Catalog 客户端
-
适用于 Apache Spark 的 Amazon Redshift 连接器
-
适用于 Apache Hadoop 的 Amazon DynamoDB 连接器
要设置自己的容器,请从 ECR Public Gallery 中拉取映像,然后运行该容器。本主题演示如何根据您的要求,使用下列方法运行容器:
-
spark-submit
-
REPL shell
(pyspark)
-
pytest
-
Visual Studio Code
先决条件
在开始之前,请确保已安装 Docker 并且 Docker 守护进程正在运行。有关安装说明,请参阅 Mac
有关在本地开发 Amazon Glue 代码时的限制的更多信息,请参阅本地开发限制。
配置 Amazon
要从容器启用 Amazon API 调用,请按照以下步骤设置 Amazon 凭证。在以下部分中,我们将使用此 Amazon 命名配置文件。
-
打开 Windows 上的
cmd
或 Mac/Linux 上的终端,并在终端中运行以下命令:PROFILE_NAME="
<your_profile_name>
"
在以下部分中,我们将使用此 Amazon 命名配置文件。
如果您在 Windows 上运行 Docker,请选择 Docker 图标(右键单击),然后在拉取映像之前选择切换到 Linux 容器。
请运行以下命令从 ECR Public 中拉取映像:
docker pull public.ecr.aws/glue/aws-glue-libs:5
运行容器
您现在可以使用此镜像运行容器。您可以根据您的要求选择以下任何选项。
spark-submit
您可以通过在容器上运行 spark-submit
命令来运行 Amazon Glue 任务脚本。
-
编写脚本并将其作为
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}
-
这些变量用于下面的 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
-
(可选)配置
spark-submit
以匹配您的环境。例如,您可以将依赖关系与--jars
配置一起传递。有关更多信息,请参阅 Spark 文档中的 Dynamically Loading Spark Properties。
REPL shell(Pyspark)
您可以运行 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
若要进行单元测试,可将 pytest
用于 Amazon 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 代码
要使用 Visual Studio Code 设置容器,请完成以下步骤:
安装 Visual Studio 代码。
安装 Python
。 在 Visual Studio 代码中打开工作区文件夹。
按
Ctrl+Shift+P
(Windows/Linux)或Cmd+Shift+P
(Mac)。键入
Preferences: Open Workspace Settings (JSON)
。按 Enter。
粘贴以下 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/", ] }
要设置容器,请按如下步骤操作:
-
运行 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
-
启动 Visual Studio 代码。
-
请选择左侧菜单中的 Remote Explorer,然后选择
amazon/aws-glue-libs:glue_libs_4.0.0_image_01
。 -
右键单击,然后选择在当前窗口中附加。
-
如果出现以下对话框,请选择知道了。
-
打开
/home/handoop/workspace/
。 -
创建 Amazon Glue PySpark 脚本,然后选择运行。
您将看到脚本成功运行。
Amazon Glue 4.0 和 Amazon Glue 5.0 Docker 映像之间的更改
Amazon Glue 4.0 和 Amazon Glue 5.0 Docker 映像之间的主要更改:
-
在 Amazon Glue 5.0 中,批处理和流式处理作业都有一个容器映像。这与 Glue 4.0 不同,Glue 4.0 中有一个映像用于批处理,另一个映像用于流式处理。
-
在 Amazon Glue 5.0 中,容器的默认用户名为
hadoop
。在 Amazon Glue 4.0 中,默认用户名为glue_user
。 -
在 Amazon Glue 5.0 中,映像中已删除其他几个库,包括 JupyterLab 和 Livy。但可以手动安装这些库。
-
在 Amazon Glue 5.0 中,所有 Iceberg、Hudi 和 Delta 库都是默认预加载,不再需要环境变量
DATALAKE_FORMATS
。在 Amazon Glue 4.0 之前,环境变量DATALAKE_FORMATS
用于指定应加载哪些特定表格式。
上述列表与 Docker 映像相关。要了解有关 Amazon Glue 5.0 更新的更多信息,请参阅 Introducing Amazon Glue 5.0 for Apache Spark
注意事项
请记住,使用 Amazon Glue 容器映像在本地开发作业脚本时,不支持以下功能。
-
Amazon Glue Parquet 写入器(在 Amazon Glue 中使用 Parquet 格式)
-
用于从 Amazon S3 路径加载 JDBC 驱动程序的属性 customJdbcDriverS3Path
-
Amazon Lake Formation 基于权限的凭证售卖
附录:添加 JDBC 驱动程序和 Java 库
要添加容器中当前不可用的 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
连接选项不能用于在 Amazon Glue 容器映像中从 Amazon S3 导入自定义 JDBC 驱动程序。