为 Ray 作业提供文件和 Python 库
本节提供了在 Amazon Glue Ray 作业中使用 Python 库所需的信息。您可以使用所有 Ray 作业中默认包含的某些公共库。也可以为 Ray 作业提供您自己的 Python 库。
Ray 作业提供的模块
您可以使用以下提供的包在 Ray 作业中执行数据集成工作流程。默认情况下,这些包在 Ray 作业中可用。
为您的 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 作业的其他 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 进行编译。这意味着您可以使用 aarch64
manylinux
仪表盘里的内容。通过将轮子重新打包到 Ray 标准,您可以以编译后的形式提供原生依赖项。通常这意味着删除 dist-info
文件夹,从而使存档的根目录中只有一个文件夹。
您无法使用此参数升级 ray
或 ray[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 中使用
-
使用您的软件包名称创建一个临时目录,然后确认您的工作目录是其父目录。您可使用以下命令执行此操作:
cd
parent_directory
mkdirtemp_dir
-
将您的文件复制到临时目录中,然后确认您的目录结构。该目录的内容将作为您的 Python 模块直接访问。您可使用以下 命令执行此操作:
ls -AR
temp_dir
# my_file_1.py # my_file_2.py -
使用 Zip 压缩您的临时文件夹。您可使用以下命令执行此操作:
zip -r
zip_file
.ziptemp_dir
-
确认您的文件已正确打包。
现在应该可以在您的工作目录中找到。您可以使用以下命令检查:zip_file
.zipzipinfo -1
zip_file
.zip # temp_dir/ # temp_dir/my_file_1.py # temp_dir/my_file_2.py
重新打包一个 Python 软件包以便在 Ray 中使用。
-
使用您的软件包名称创建一个临时目录,然后确认您的工作目录是其父目录。您可使用以下命令执行此操作:
cd
parent_directory
mkdirtemp_dir
-
解压缩您的软件包并将内容复制到您的临时目录中。移除与之前的打包标准相关的文件,只保留模块的内容。使用以下命令确认您的文件结构看起来正确:
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 -
使用 Zip 压缩您的临时文件夹。您可使用以下命令执行此操作:
zip -r
zip_file
.ziptemp_dir
-
确认您的文件已正确打包。
现在应该可以在您的工作目录中找到。您可以使用以下命令检查:zip_file
.zipzipinfo -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