如何在我的 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 模块:

  1. 打开 AWS Glue 控制台
  2. 在导航窗格中,选择任务
  3. 选择要添加 Python 模块的任务。
  4. 选择操作,然后选择编辑任务
  5. 展开安全配置、脚本库和任务参数 (可选) 部分。
  6. 任务参数下,执行以下操作:
    对于,输入 --additional-python-modules
    对于,输入 pymysql==1.0.2, s3://aws-glue-add-modules/nltk-3.6.2-py3-none-any.whl
  7. 选择保存

这些步骤提供了安装两个不同模块的示例:

  • 通过互联网的 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 库?


这篇文章对您有帮助吗?


您是否需要账单或技术支持?