Help us improve the AWS re:Post Knowledge Center by sharing your feedback in a brief survey. Your input can influence how we create and update our content to better support your AWS journey.
如何在 AWS Glue ETL 作业中使用外部 Python 库?
我想在 AWS Glue 提取、转换、加载 (ETL) 作业中使用外部 Python 库。
简短描述
当使用 AWS Glue 2.0、3.0 和 4.0 版本时,您可以在作业级别安装其他 Python 模块或不同的模块版本。要添加新模块或更改现有模块的版本,请使用 --additional-python-modules 作业参数键。该键的值是以逗号分隔的 Python 模块名称的列表。当您使用此参数时,您的 AWS Glue ETL 作业会通过 Python 包安装程序 (pip3) 安装其他模块。
您也可以使用 --additional-python-modules 参数来安装采用基于 C 的语言编写的 Python 库。
解决方法
安装或更新 Python 模块
要为您的 AWS Glue 作业安装其他 Python 模块,请完成以下步骤:
- 打开 AWS Glue 控制台。
- 在导航窗格中,选择作业。
- 选择要添加 Python 模块的作业。
- 选择操作,然后选择编辑作业。
- 展开**安全配置、脚本库和作业参数(可选)**部分。
- 在作业参数下,执行以下操作:
在键中输入 --additional-python-modules。
在 Value(值)中,输入要添加的模块的逗号分隔列表。 - 选择 Save(保存)。
例如,假设您要添加两个新模块:PyMySQL 的 1.0.2 版和自然语言工具包 (NLTK) 的 3.6.2 版。您可以从互联网安装 PyMySQL 模块,从Amazon Simple Storage Service (Amazon S3) 存储桶安装 NLTK 模块。在这种情况下,--additional-python-modules 参数键的值将为 pymysql==1.0.2, s3://aws-glue-add-modules/nltk-3.6.2-py3-none-any.whl。
某些模块依赖于其他模块。如果您安装或更新此类模块,则您还必须下载该模块所依赖的其他模块。这意味着您必须能够访问互联网才能安装或更新该模块。如果您无法访问互联网,请参阅 Building Python modules from a wheel for Spark ETL workloads using AWS Glue 2.0。
有关每个 AWS Glue 版本中默认包含的 Python 模块的列表,请参阅 AWS Glue 中已提供的 Python 模块。
安装基于 C 的 Python 模块
**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI。
AWS Glue 还支持采用 C 编写的包含 --additional-python-modules 参数的库和扩展。但是,某些 Python 模块(如 spacy 和 grpc)需要根权限才能进行安装。AWS Glue 在包安装期间不会提供根访问权限。要解决此问题,请将二进制文件预编译成与 AWS Glue 兼容的 wheel 文件,然后安装该 wheel 文件。
要编译使用基于 C 的语言的库,编译器必须与目标操作系统和处理器架构兼容。如果库针对不同的操作系统或处理器架构编译,wheel 不会安装在 AWS Glue 中。由于 AWS Glue 是一项托管服务,因此不能通过集群访问来开发这些依赖项。
要预编译需要根权限的基于 C 的 Python 模块,请完成以下步骤:
-
启动一个 Amazon Elastic Compute Cloud (Amazon EC2) Linux 实例 (Amazon Linux 2 AMI),为您的库留出足够的卷空间。
-
在 EC2 实例上安装 Docker,设置非 sudo 访问权限,然后启动 Docker。为此,请运行以下命令:
安装 Docker:
sudo yum install docker -y设置 sudo 访问权限:
sudo su启动 Docker:
sudo service docker start -
为模块创建 Dockerfile 文件。例如,要安装 grpcio 模块,请创建一个名为 dockerfile_grpcio 的文件,然后将以下内容复制到该文件中:
FROM amazonlinux:2 \# Install required repositories and tools RUN yum update -y RUN yum install shadow-utils.x86\_64 -y \# Install Java 8 (corrected package name) RUN yum install -y java-1.8.0-openjdk.x86\_64 \# Install Python 3.7 WORKDIR /opt RUN yum install -y gcc openssl-devel bzip2-devel libffi-devel wget tar make \# Install Python 3.7 RUN wget https://www.python.org/ftp/python/3.7.12/Python-3.7.12.tgz RUN tar xzf Python-3.7.12.tgz WORKDIR /opt/Python-3.7.12 RUN ./configure --enable-optimizations RUN make altinstall RUN ln -sf /usr/local/bin/python3.7 /usr/bin/python3 RUN ln -sf /usr/local/bin/pip3.7 /usr/bin/pip3 \# Verify Python version RUN python3 --version RUN pip3 --version \# Install other dependencies RUN yum install -y doxygen autoconf automake libtool zlib-devel openssl-devel maven wget protobuf-compiler cmake make gcc-c++ RUN yum install -y python3-devel \# Install Python packages RUN pip3 install --upgrade pip RUN pip3 install wheel RUN pip3 install cython numpy scipy RUN pip3 install cmake scikit-build \# Create wheel directory and install grpcio WORKDIR /root RUN mkdir wheel\_dir RUN pip3 install Cython RUN pip3 install grpcio RUN pip3 wheel grpcio -w wheel\_dir -
运行 docker build 以构建 Dockerfile:
docker build -f dockerfile\_grpcio . -
重启 Docker 进程守护程序:
sudo service docker restartdocker build 命令运行完成后,您会收到一条成功消息,其中包含您的 Docker 映像 ID。例如,"Successfully built 1111222233334444"。记下 Docker 映像 ID,下一步会用到。
-
从 Docker 容器中提取 .whl wheel 文件。为此,请运行以下命令:
获取 Docker 映像 ID:
docker image ls运行容器,但将 1111222233334444 替换为您的 Docker 映像 ID:
docker run -dit 111122223334444验证 wheel 文件的位置并检索 wheel 文件的名称,但将 5555666677778888 替换为您的容器 ID:
docker exec -t -i 5555666677778888 ls /root/wheel\_dir/将 wheel 文件从 Docker 容器复制到 Amazon EC2:
docker cp 5555666677778888:/root/wheel\_dir/doc-example-wheel .**注意:**请将 doc-example-wheel 替换为您生成的 wheel 文件的名称
-
要将 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/**注意:**务必将 grpcio-1.32.0-cp37-cp37m-linux_x86_64.whl 替换为 Python 包文件的名称。
-
打开 AWS Glue 控制台。
-
对于 AWS Glue ETL 作业,请在 Job parameters(作业参数)下输入以下内容:
在键中输入 --additional-python-modules。
在 Value(值)中输入 s3://aws-glue-add-modules/grpcio/grpcio-1.32.0-cp37-cp37m-linux_x86_64.whl。

