为 Ray 作业提供文件和 Python 库 - AWS Glue

为 Ray 作业提供文件和 Python 库

重要

自 2026 年 4 月 30 日起,AWS Glue for Ray 将不再向新客户开放。要使用 AWS Glue for Ray,请在该日期之前注册。现有客户可以继续正常使用该服务。要获取与 AWS Glue for Ray 相似的功能,可探索 Amazon EKS。有关更多信息,请参阅 AWS Glue for Ray 终止支持

本节提供了在 AWS Glue Ray 作业中使用 Python 库所需的信息。您可以使用所有 Ray 作业中默认包含的某些公共库。也可以为 Ray 作业提供您自己的 Python 库。

Ray 作业提供的模块

您可以使用以下提供的包在 Ray 作业中执行数据集成工作流程。默认情况下,这些包在 Ray 作业中可用。

AWS Glue version 4.0

在 AWS Glue 4.0 中,Ray(Ray2.4 运行时系统)环境提供以下软件包:

  • boto3 == 1.26.133

  • ray == 2.4.0

  • pyarrow == 11.0.0

  • pandas==1.5.3

  • numpy == 1.24.3

  • fsspec == 2023.4.0

此列表包括所有将与 ray[data] == 2.4.0 一起安装的软件包。开箱即用支持 Ray Data。

为您的 Ray 作业提供文件

您可以使用 --working-dir 参数为 Ray 作业提供文件。为此参数提供指向 Amazon S3 上托管的.zip 文件的路径。在 .zip 文件中,您的文件必须包含在单个顶级目录中。任何其他文件都不应位于顶层。

在脚本开始运行之前,您的文件将分发到每个 Ray 节点。考虑一下这会如何影响每个 Ray 节点的可用磁盘空间。可用磁盘空间由作业配置中设置的 WorkerType 决定。如果您想大规模提供作业数据,那么这种机制不是合适的解决方案。有关为作业系统数据的更多信息,请参阅 连接 Ray 作业中的数据

可以访问您的文件,就像通过 working_dir 参数向 Ray 提供目录一样。例如,要读取 .zip 文件顶级目录中名为 sample.txt 的文件,可以调用:

@ray.remote def do_work(): f = open("sample.txt", "r") print(f.read())

有关 working_dir 的详细信息,请参阅 Ray 文档。此功能的行为与 Ray 的原生功能类似。

用于 Ray 作业的其他 Python 模块

来自 PyPI 的其他模块

Ray 作业使用 Python Package Installer (pip3) 安装 Ray 脚本使用的其他模块。您可以将 --pip-install 参数与逗号分隔的 Python 模块列表结合使用,以添加新模块或更改现有模块的版本。

例如,要更新或添加新的 scikit-learn 模块,请使用以下键-值对:

"--pip-install", "scikit-learn==0.21.3"

如果您有自定义模块或自定义补丁,则可以使用 --s3-py-modules 参数从 Amazon S3 分发自己的库。在上传发行版之前,您的发行版可能需要重新打包和重新构建。遵循 在 Ray 作业中包含 Python 代码 中的准则。

来自 Amazon S3 的自定义分配

自定义发行版应符合 Ray 依赖项打包要求。您可以在下一节中了解如何构建这些发行版。有关 Ray 如何设置依赖项的更多信息,请参阅 Ray 文档中的 Environment Dependencies(环境依赖项)。

要在评估其内容后添加自定义可分发文件,请将您的可分发文件上传到作业的 IAM 角色可用的存储桶。在参数配置中指定 Python ZIP 存档的 Amazon S3 路径。如果您要提供多个可分发文件,请用逗号分隔它们。例如:

"--s3-py-modules", "s3://s3bucket/pythonPackage.zip"

限制

Ray 作业不支持在作业环境中编译本机代码。如果您的 Python 依赖项在传递期间依赖于本机编译的代码,则可能会受到此限制。Ray 作业可以运行提供的二进制文件,但必须已针对基于 ARM64 的 Linux 进行编译。这意味着您可以使用 aarch64manylinux 仪表盘里的内容。通过将轮子重新打包到 Ray 标准,您可以以编译后的形式提供原生依赖项。通常这意味着删除 dist-info 文件夹,从而使存档的根目录中只有一个文件夹。

您无法使用此参数升级 rayray[data] 的版本。要使用新版本的 Ray,您需要在我们发布对作业的支持后更改运行时字段。有关支持的 Ray 版本的更多信息,请参阅 AWS Glue 版本

在 Ray 作业中包含 Python 代码

Python 软件基金会为打包 Python 文件以供在不同的运行时使用提供了标准化的行为。请注意,Ray 引入了打包标准的限制。除对 Ray 规定打包标准外,AWS Glue 未指定其他打包标准。以下说明提供了有关打包简单 Python 包的标准指导。

将您的文件打包为 .zip 存档。目录应位于存档的根目录处。存档的根级别上应该没有其他文件,否则,这可能会导致意外行为。根目录是软件包,其名称用于在导入时引用您的 Python 代码。

如果您使用 --s3-py-modules 将这种形式的分配提供给 Ray 作业,则应该能够在 Ray 脚本中从软件包中导入 Python 代码。

您的软件包可以为单个 Python 模块提供一些 Python 文件,也可以将许多模块打包在一起。重新打包依赖关系(例如 PyPI 中的库)时,请检查这些软件包中是否有隐藏文件和元数据目录

警告

某些操作系统行为使得正确遵循这些打包说明变得困难。

  • OSX 可能会将隐藏文件(例如 __MACOSX 添加到顶层的 Zip 文件文件中)。

  • Windows 可能会自动将您的文件添加到 Zip 内的文件夹,从而无意中创建了一个嵌套文件夹。

以下过程假设您正在 Amazon Linux 2 或提供 Info-ZIP zip 分发版和 zipinfo 实用程序的类似操作系统中与文件进行交互。我们建议使用这些工具来防止意外行为。

打包 Python 文件以在 Ray 中使用

  1. 使用您的软件包名称创建一个临时目录,然后确认您的工作目录是其父目录。您可使用以下命令执行此操作:

    cd parent_directory mkdir temp_dir
  2. 将您的文件复制到临时目录中,然后确认您的目录结构。该目录的内容将作为您的 Python 模块直接访问。您可使用以下 命令执行此操作:

    ls -AR temp_dir # my_file_1.py # my_file_2.py
  3. 使用 Zip 压缩您的临时文件夹。您可使用以下命令执行此操作:

    zip -r zip_file.zip temp_dir
  4. 确认您的文件已正确打包。zip_file.zip 现在应该可以在您的工作目录中找到。您可以使用以下命令检查:

    zipinfo -1 zip_file.zip # temp_dir/ # temp_dir/my_file_1.py # temp_dir/my_file_2.py

重新打包一个 Python 软件包以便在 Ray 中使用。

  1. 使用您的软件包名称创建一个临时目录,然后确认您的工作目录是其父目录。您可使用以下命令执行此操作:

    cd parent_directory mkdir temp_dir
  2. 解压缩您的软件包并将内容复制到您的临时目录中。移除与之前的打包标准相关的文件,只保留模块的内容。使用以下命令确认您的文件结构看起来正确:

    ls -AR temp_dir # my_module # my_module/__init__.py # my_module/my_file_1.py # my_module/my_submodule/__init__.py # my_module/my_submodule/my_file_2.py # my_module/my_submodule/my_file_3.py
  3. 使用 Zip 压缩您的临时文件夹。您可使用以下命令执行此操作:

    zip -r zip_file.zip temp_dir
  4. 确认您的文件已正确打包。zip_file.zip 现在应该可以在您的工作目录中找到。您可以使用以下命令检查:

    zipinfo -1 zip_file.zip # temp_dir/my_module/ # temp_dir/my_module/__init__.py # temp_dir/my_module/my_file_1.py # temp_dir/my_module/my_submodule/ # temp_dir/my_module/my_submodule/__init__.py # temp_dir/my_module/my_submodule/my_file_2.py # temp_dir/my_module/my_submodule/my_file_3.py