

# 为 Ray 作业提供文件和 Python 库
<a name="edit-script-ray-env-dependencies"></a>

**重要**  
自 2026 年 4 月 30 日起，AWS Glue for Ray 将不再向新客户开放。要使用 AWS Glue for Ray，请在该日期之前注册。现有客户可以继续正常使用该服务。要获取与 AWS Glue for Ray 相似的功能，可探索 Amazon EKS。有关更多信息，请参阅 [AWS Glue for Ray 终止支持](https://docs.aws.amazon.com/glue/latest/dg/awsglue-ray-jobs-availability-change.html)。

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

## Ray 作业提供的模块
<a name="edit-script-ray-modules-provided"></a>

您可以使用以下提供的包在 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 作业提供文件
<a name="edit-script-ray-working-directory"></a>

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

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

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

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

有关 `working_dir` 的详细信息，请参阅 [Ray 文档](https://docs.ray.io/en/latest/ray-core/handling-dependencies.html#remote-uris)。此功能的行为与 Ray 的原生功能类似。

## 用于 Ray 作业的其他 Python 模块
<a name="edit-script-ray-python-libraries-additional"></a>

**来自 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 代码](#edit-script-ray-packaging) 中的准则。

**来自 Amazon S3 的自定义分配**

自定义发行版应符合 Ray 依赖项打包要求。您可以在下一节中了解如何构建这些发行版。有关 Ray 如何设置依赖项的更多信息，请参阅 Ray 文档中的 [Environment Dependencies](https://docs.ray.io/en/latest/ray-core/handling-dependencies.html)（环境依赖项）。

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

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

**限制**

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

您无法使用此参数升级 `ray` 或 `ray[data]` 的版本。要使用新版本的 Ray，您需要在我们发布对作业的支持后更改运行时字段。有关支持的 Ray 版本的更多信息，请参阅 [AWS Glue 版本](release-notes.md#release-notes-versions)。

## 在 Ray 作业中包含 Python 代码
<a name="edit-script-ray-packaging"></a>

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
   ```

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

   ```
   ls -AR temp_dir
   # my_file_1.py
   # my_file_2.py
   ```

1. 使用 Zip 压缩您的临时文件夹。您可使用以下命令执行此操作：

   ```
   zip -r zip_file.zip temp_dir
   ```

1. 确认您的文件已正确打包。`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
   ```

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

   ```
   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
   ```

1. 使用 Zip 压缩您的临时文件夹。您可使用以下命令执行此操作：

   ```
   zip -r zip_file.zip temp_dir
   ```

1. 确认您的文件已正确打包。`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
   ```