如何在 AWS Glue ETL 作业中使用外部 Python 库?

3 分钟阅读
0

我想在 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 模块,请完成以下步骤:

  1. 打开 AWS Glue 控制台
  2. 在导航窗格中,选择作业
  3. 选择要添加 Python 模块的作业。
  4. 选择操作,然后选择编辑作业
  5. 展开**安全配置、脚本库和作业参数(可选)**部分。
  6. 作业参数下,执行以下操作:
    中输入 --additional-python-modules
    Value(值)中,输入要添加的模块的逗号分隔列表。
  7. 选择 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 模块(如 spacygrpc)需要根权限才能进行安装。AWS Glue 在包安装期间不会提供根访问权限。要解决此问题,请将二进制文件预编译成与 AWS Glue 兼容的 wheel 文件,然后安装该 wheel 文件。

要编译使用基于 C 的语言的库,编译器必须与目标操作系统和处理器架构兼容。如果库针对不同的操作系统或处理器架构编译,wheel 不会安装在 AWS Glue 中。由于 AWS Glue 是一项托管服务,因此不能通过集群访问来开发这些依赖项。

要预编译需要根权限的基于 C 的 Python 模块,请完成以下步骤:

  1. 启动一个 Amazon Elastic Compute Cloud (Amazon EC2) Linux 实例 (Amazon Linux 2 AMI),为您的库留出足够的卷空间。

  2. 在 EC2 实例上安装 Docker,设置非 sudo 访问权限,然后启动 Docker。为此,请运行以下命令:

    安装 Docker:

    sudo yum install docker -y

    设置 sudo 访问权限:

    sudo su

    启动 Docker:

    sudo service docker start
  3. 为模块创建 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
  4. 运行 docker build 以构建 Dockerfile:

    docker build -f dockerfile\_grpcio .
  5. 重启 Docker 进程守护程序:

    sudo service docker restart

    docker build 命令运行完成后,您会收到一条成功消息,其中包含您的 Docker 映像 ID。例如,“Successfully built 1111222233334444”(已成功构建 1111222233334444)。记下 Docker 映像 ID,下一步会用到。

  6. 从 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 文件的名称

  7. 要将 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 包文件的名称。

  8. 打开 AWS Glue 控制台

  9. 对于 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

相关信息

Using Python libraries with AWS Glue

AWS 官方
AWS 官方已更新 1 个月前