

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 為 Ray 任務提供檔案和 Python 程式庫
<a name="edit-script-ray-env-dependencies"></a>

**重要**  
AWS Glue for Ray 自 2026 年 4 月 30 日起不再向新客戶開放。如果您想要使用 AWS Glue for Ray，請在該日期之前註冊。現有客戶可以繼續正常使用該服務。如需類似 AWS Glue for Ray 的 功能，請探索 Amazon EKS。如需詳細資訊，請參閱 [AWS Glue 的 Ray 終止支援](https://docs.aws.amazon.com/glue/latest/dg/awsglue-ray-jobs-availability-change.html)。

本節提供將 Python 程式庫與 Ray AWS Glue 任務搭配使用時所需的資訊。您可以使用預設包含於所有 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` wheel 的內容。您可將 wheel 重新封裝為 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 引入了您應留意的封裝標準限制。 AWS Glue 不會指定超出 Ray 規定的封裝標準。下列說明提供關於封裝簡易 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
   ```