为 Ray 作业提供文件和 Python 库 - Amazon Glue
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

为 Ray 作业提供文件和 Python 库

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

Ray 作业提供的模块

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

Amazon Glue version 4.0

在 Amazon 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 版本的更多信息,请参阅 Amazon Glue 版本

在 Ray 作业中包含 Python 代码

Python 软件基金会为打包 Python 文件以供在不同的运行时使用提供了标准化的行为。请注意,Ray 引入了打包标准的限制。除对 Ray 规定打包标准外,Amazon 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