如何在我的 AWS Glue 2.0 ETL 任务中使用外部 Python 库?
上次更新日期:2022 年 3 月 11 日
我想在 AWS Glue 2.0 提取、转换和加载 (ETL) 任务中使用外部 Python 库。
解决方法
借助 AWS Glue 2.0 版,您可以在任务级别安装其他 Python 模块或不同版本。要添加新模块或更改现有模块的版本,请使用 --additional-python-modules 任务参数键,其值包含逗号分隔的 Python 模块列表。这允许您的 AWS Glue 2.0 ETL 任务使用 Python 程序包安装程序 (pip3) 安装其他模块。
要为 AWS Glue 任务安装额外的 Python 模块:
- 打开 AWS Glue 控制台。
- 在导航窗格中,选择任务。
- 选择要添加 Python 模块的任务。
- 选择操作,然后选择编辑任务。
- 展开安全配置、脚本库和任务参数 (可选) 部分。
- 在任务参数下,执行以下操作:
对于键,输入 --additional-python-modules。
对于值,输入 pymysql==1.0.2, s3://aws-glue-add-modules/nltk-3.6.2-py3-none-any.whl。 - 选择保存。
这些步骤提供了安装两个不同模块的示例:
- 通过互联网的 PyMySQL
- 来自 Amazon Simple Storage Service (Amazon S3) 上 wheel 文件的自然语言工具包 (NLTK)
安装新模块或更新现有模块需要下载与模块相关的依赖项。这意味着您需要访问互联网才能完成这些任务中的任何一项。如果您没有互联网访问权限,请参阅使用 AWS Glue 2.0 从 wheel 文件构建适用于 Spark ETL 工作负载的 Python 模块。
有关 AWS Glue 2.0 中已提供的其他 Python 模块的列表,请参阅 AWS Glue 2.0 版中已提供的 Python 模块。
AWS Glue 2.0 还通过 --additional-python-modules 选项支持使用 C 编写的库和扩展模块。但是,Python 模块的子集,例如 spacy 和 grpc,需要 root 权限才能安装。如果没有 root 权限,这些模块的编译将在安装过程中失败。AWS Glue 在程序包安装期间不提供 root 访问权限。解决方案是将二进制文件预编译成与 AWS Glue 兼容的 wheel 文件并安装该文件。
要编译基于 C 语言的库,编译器必须与目标操作系统和处理器架构兼容。如果根据不同的操作系统或处理器架构编译库,则不会在 AWS Glue 中安装 wheel 文件。由于 AWS Glue 是托管式服务,因此集群访问权限不可用于开发这些依赖项。要预编译需要 root 权限的基于 C 的 Python 模块,请执行以下操作:
注意:这些步骤提供了安装 grpcio 模块的示例。
1. 启动一个 Amazon Elastic Compute Cloud (Amazon EC2) Linux 实例,同时为您的库留出足够的卷空间。
2. 在实例上安装 Docker 容器,设置非 sudo 访问权限,然后启动 Docker。
sudo yum install docker -y
sudo usermod -a -G docker ec2-user
sudo service docker start
3. 创建文件 dockerfile_grpcio 并将以下内容复制到文件中:
# Base for AWS Glue
FROM amazonlinux
RUN yum update -y
RUN yum install shadow-utils.x86_64 -y
RUN yum install -y java-1.8.0-openjdk.x86_64
RUN yum install -y python3
RUN yum install -y cython doxygen numpy scipy gcc autoconf automake libtool zlib-devel openssl-devel maven wget protobuf-compiler cmake make gcc-c++
# Additional components needed for grpcio
WORKDIR /root
RUN yum install python3-devel -y
RUN yum install python-devel -y
RUN pip3 install wheel
# Install grpcio and related modules
RUN pip3 install Cython
RUN pip3 install cmake scikit-build
RUN pip3 install grpcio
# Create a directory for the wheel
RUN mkdir wheel_dir
# Create the wheel
RUN pip3 wheel grpcio -w wheel_dir
4. 运行 docker build 来构建您的 Dockerfile。运行以下命令以重新启动 Docker 守护进程:
$ sudo service docker restart
$ docker build -f dockerfile_grpcio .
当 docker build 命令完成时,将显示带有您的 Docker 镜像 ID 的成功消息。例如,"Successfully built 1111222233334444"。 请注意要在下一步中使用的 Docker 镜像 ID。
5. 从 Docker 容器中提取 wheel 文件。运行以下命令来提取 .whl 文件:
# Get the docker image ID
$ docker image ls
# Run the container
$ docker run -dit 111122223334444
# Verify the location of the wheel file and retrieve the name of the wheel file
$ docker exec -t -i 5555666677778888 ls /root/wheel_dir/
# Copy the wheel out of docker to EC2
$ docker cp 5555666677778888:/root/wheel_dir/doc-example-wheel .
请务必在之前的命令中替换以下值:
- 将 1111222233334444 替换为 Docker 镜像 ID
- 将 5555666677778888 替换为容器 ID
- 将 doc-example-wheel 替换为所生成 wheel 文件的名称
6. 通过运行以下命令将 wheel 文件上传到 Amazon S3:
aws s3 cp doc-example-wheel s3://path/to/wheel/
aws s3 cp grpcio-1.32.0-cp37-cp37m-linux_x86_64.whl s3://aws-glue-add-modules/grpcio/
请务必在之前的命令中替换以下值:
- 将 doc-example-wheel 替换为所生成 wheel 文件的名称
- 将 grpcio-1.32.0-cp37-cp37m-linux_x86_64.whl替换为 Python 程序包文件的名称
7. 对于 AWS Glue ETL 任务,请在 AWS Glue 控制台的任务参数下执行以下操作:对于键,输入 --additional-python-modules。
对于值,输入 s3://aws-glue-add-modules/grpcio/grpcio-1.32.0-cp37-cp37m-linux_x86_64.whl。
注意:请务必用 Python 程序包文件的名称替换 grpcio-1.32.0-cp37-cp37m-linux_x86_64.whl。
重要提示:AWS Glue 0.9 和 1.0 版本不支持以 C 编写的 Python 模块。要在 AWS Glue 0.9 和 1.0 中安装外部 Python 库,请参阅如何在我的 AWS Glue 1.0 或 0.9 ETL 任务中使用外部 Python 库?