

# 对日志中的 AWS Glue for Ray 错误进行故障排除
<a name="troubleshooting-ray"></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 进程发出的日志的访问权限。如果您在 Ray 作业中遇到错误或意外行为，请先从日志中收集信息以确定失败原因。我们还为交互式会话提供类似的日志。会话日志以 `/aws-glue/ray/sessions` 前缀提供。

当您的作业运行时，日志行会实时发送到 CloudWatch。运行完成后，打印语句会附加到 CloudWatch 日志中。作业运行后，日志将保留两周。

## 检查 Ray 作业日志
<a name="troubleshooting-ray-log-locations"></a>

当作业失败时，收集您的作业名称和作业运行 ID。您可以在 AWS Glue 控制台中找到这些内容。导航到作业页面，然后导航到 **Runs**（运行）选项卡。Ray 作业日志存储在以下专用 CloudWatch 日志组中。
+ `/aws-glue/ray/jobs/script-log/` — 存储您的主 Ray 脚本发出的日志。
+ `/aws-glue/ray/jobs/ray-monitor-log/` — 存储 Ray 自动缩放器进程发出的日志。这些日志是针对头节点生成的，而不是为其他 Worker 节点生成的。
+ `/aws-glue/ray/jobs/ray-gcs-logs/` - 存储 GCS（全局控制存储）进程发出的日志。这些日志是针对头节点生成的，而不是为其他 Worker 节点生成的。
+ `/aws-glue/ray/jobs/ray-process-logs/` - 存储在头节点上运行的其他 Ray 进程（主要是控制面板代理）发出的日志。这些日志是针对头节点生成的，而不是为其他 Worker 节点生成的。
+ ` /aws-glue/ray/jobs/ray-raylet-logs/` - 存储每个 raylet 进程发出的日志。这些日志是在每个 Worker 节点的单个数据流中收集的。
+ `/aws-glue/ray/jobs/ray-worker-out-logs/` - 存储集群中每个工作线程的 `stdout` 日志。这些日志是为每个 Worker 节点生成的，包括头节点。
+ `/aws-glue/ray/jobs/ray-worker-err-logs/` - 存储集群中每个工作线程的 `stderr` 日志。这些日志是为每个 Worker 节点生成的，包括头节点。
+ `/aws-glue/ray/jobs/ray-runtime-env-log/` - 存储有关 Ray 设置过程的日志。这些日志是为每个 Worker 节点生成的，包括头节点。

## Ray 作业错误故障排除
<a name="troubleshooting-ray-errors"></a>

要了解 Ray 日志组的组织结构，并找到可以帮助您解决错误的日志组，需要了解有关 Ray 架构的背景信息。

在 AWS Glue ETL 中，工作线程对应于一个实例。当您为某项 AWS Glue 作业配置工作线程时，您需要设置专用于作业的实例的类型和数量。Ray 以不同的方式使用*工件*一词。

Ray 使用*头节点*和* Worker 节点*来区分 Ray 集群中实例的职责。Ray Worker 节点可以托管多个*操作者*进程，这些进程执行计算以实现分布式计算的结果。运行函数副本的操作者称为*副本*。副本操作者也可以称为工作线程进程。副本也可以在头节点上运行，该节点被称为头节点，因为它运行其他进程来协调集群。

参与计算的每个操作者都会生成自己的日志流。这为我们提供了一些见解：
+ 发出日志的进程数量，可能大于分配给作业的工作线程数量。通常，每个实例上的每个核心都有一个操作者。
+  Ray 头节点发出集群管理和启动日志。相比之下，Ray Worker 节点只会发出在其上执行的工作的日志。

有关 Ray 架构的更多信息，请参阅 Ray 文档中的[架构白皮书]( https://docs.ray.io/en/latest/ray-contribute/whitepaper.html)。

### 问题领域：Amazon S3 访问权限
<a name="troubleshooting-ray-errors-s3"></a>

检查作业运行的失败消息。如果这不能提供足够的信息，请检查 `/aws-glue/ray/jobs/script-log/`。

### 问题领域：PIP 依赖关系管理
<a name="troubleshooting-ray-errors-dependencies"></a>

检查 `/aws-glue/ray/jobs/ray-runtime-env-log/`。

### 问题领域：检查主进程中的中间值
<a name="troubleshooting-ray-errors-main-process"></a>

向主脚本写入 `stderr` 或从主脚本写出 `stdout`，然后从 `/aws-glue/ray/jobs/script-log/` 中检索日志。

### 问题领域：检查子进程中的中间值
<a name="troubleshooting-ray-errors-worker-process"></a>

从 `remote` 函数写入 `stderr` 或写出 `stdout`。然后，从 `/aws-glue/ray/jobs/ray-worker-out-logs/` 或 `/aws-glue/ray/jobs/ray-worker-err-logs/` 检索日志。您的函数可能已在任何副本上运行，因此您可能需要检查多个日志才能找到预期的输出。

### 问题领域：解释错误消息中的 IP 地址
<a name="troubleshooting-ray-errors-ips"></a>

在某些错误情况下，您的作业可能会发出包含 IP 地址的错误消息。这些 IP 地址是临时性的，供集群用来识别节点并在节点之间进行通信。根据 IP 地址，节点的日志将发布到带有唯一后缀的日志流。

在 CloudWatch 中，您可以通过识别此后缀来筛选日志，以检查特定于此 IP 地址的日志。例如，给定 *FAILED\$1IP* 和 *JOB\$1RUN\$1ID*，您可以用以下方式标识后缀：

```
filter @logStream like /JOB_RUN_ID/
| filter @message like /IP-/
| parse @message "IP-[*]" as ip
| filter ip like /FAILED_IP/
| fields replace(ip, ":", "_") as uIP
| stats count_distinct by uIP as logStreamSuffix
| display logStreamSuffix
```