排查批次和会话创建失败问题

本文档提供有关排查常见问题的指导,这些问题会阻止Google Cloud Serverless for Apache Spark Spark 批量工作负载和交互式会话启动。

概览

通常,当批处理或会话无法启动时,系统会报告以下错误消息:

Driver compute node failed to initialize for batch in 600 seconds

此错误消息表明,Spark 驱动程序在默认超时期限(600 秒,即 10 分钟)内无法启动。常见原因与服务账号权限、资源可用性、网络配置或 Spark 属性有关。

批次和会话启动失败原因及问题排查步骤

以下部分列出了导致批次和会话启动失败的常见原因,并提供了问题排查提示,可帮助您解决这些问题。

服务账号权限不足

Serverless for Apache Spark 批处理或会话使用的服务账号需要特定的 IAM 角色,这些角色包含 Serverless for Apache Spark 操作的权限以及对 Google Cloud 资源的访问权限。如果服务账号缺少必要的角色,则批处理或会话的 Spark 驱动程序可能无法初始化。

  • 必需的 Worker 角色:批处理或会话服务账号必须具有 Dataproc Worker 角色 (roles/dataproc.worker)。此角色包含 Serverless for Apache Spark 预配和管理计算资源所需的最低权限。
  • 数据访问权限:如果您的 Spark 应用从 Cloud Storage 或 BigQuery 读取数据或向其写入数据,则服务账号需要与这些服务相关的角色:
    • Cloud Storage:需要 Storage Object Viewer 角色 (roles/storage.objectViewer) 才能读取,需要 Storage Object Creator 角色 (roles/storage.objectCreator) 或 Storage Object Admin 角色 (roles/storage.admin) 才能写入。
    • BigQuery:需要 BigQuery Data Viewer 角色 (roles/bigquery.dataViewer) 才能读取数据,需要 BigQuery Data Editor 角色 (roles/bigquery.dataEditor) 才能写入数据。
  • 日志记录权限:服务账号需要具有将日志写入 Cloud Logging 的权限的角色。通常,Logging Writer 角色 (roles/logging.logWriter) 就足够了。

问题排查提示:

配额不足

如果超出项目或区域特定的 Google Cloud Serverless for Apache Spark Google Cloud 或其他资源配额,可能会导致无法启动新的批处理或会话。

问题排查提示:

  • 查看 Google Cloud Serverless for Apache Spark 配额页面,了解并发批次、DCU 和 shuffle 存储空间的限制。

    • 您还可以使用 gcloud compute quotas list 命令查看项目和区域的当前用量和限制:
      gcloud compute quotas list --project=PROJECT_ID --filter="service:dataproc.googleapis.com"
      
  • 如果您经常达到配额限制,请考虑通过 Google Cloud 控制台申请增加配额。

网络配置问题

不正确的网络设置(例如 VPC 配置、专用 Google 访问通道或防火墙规则)可能会阻止 Spark 驱动程序初始化或连接到必要的服务。

问题排查提示:

  • 验证为批处理或会话指定的 VPC 网络和子网是否已正确配置,并且有足够的可用 IP 地址。

  • 如果您的批处理或会话需要访问 Google API 和服务,但不想通过公共互联网,请验证是否已为子网启用专用 Google 访问通道。

  • 检查您的 VPC 防火墙规则,验证它们是否不会意外阻止内部通信或流向 Google API 或 Spark 应用所需的外部服务的出站流量。

Spark 属性无效或应用代码存在问题

配置错误的 Spark 属性(尤其是与驱动程序资源相关的属性)或 Spark 应用代码中的问题可能会导致启动失败。

问题排查提示:

  • 检查 spark.driver.memoryspark.driver.cores 值。 验证它们是否在合理范围内,并与可用的 DCU 保持一致。 如果这些属性的值过大,可能会导致资源耗尽和初始化失败。移除所有不必要或实验性的 Spark 属性,以简化调试。

  • 尝试运行“Hello World”Spark 应用,以确定问题是出在环境设置上,还是由于代码复杂性或错误所致。

  • 验证为批处理或会话指定的所有应用 JAR、Python 文件或依赖项是否正确位于 Cloud Storage 中,并且是否可由批处理或会话服务账号访问。

检查日志

诊断批量创建失败的关键一步是检查 Cloud Logging 中的详细日志。

  1. 前往 Google Cloud 控制台中的 Cloud Logging 页面。
  2. 过滤 Serverless for Apache Spark 批处理或会话:
    1. 资源下拉菜单中,选择 Cloud Dataproc BatchCloud Dataproc Session
    2. batch_idsession_id 过滤失败的批次或会话。 您还可以按 project_idlocation(区域)进行过滤。
  3. 查找包含 jsonPayload.component="driver" 的日志条目。 这些日志通常包含特定的错误消息或堆栈轨迹,可在 600 秒超时之前找出驱动程序初始化失败的原因。