排查集群创建问题

本文档介绍了常见的集群创建错误消息,并提供了有关排查集群创建问题的提示。

常见的集群创建错误消息

  • 用户未获得充当服务账号的授权

    原因:尝试创建 Managed Service for Apache Spark 集群的主账号没有使用指定服务账号所需的权限。Managed Service for Apache Spark 用户必须拥有服务账号 ActAs 权限才能部署 Managed Service for Apache Spark 资源;此权限包含在“服务账号用户”角色 (roles/iam.serviceAccountUser) 中(请参阅 Managed Service for Apache Spark 角色)。

    解决方案:确定尝试创建 Managed Service for Apache Spark 集群的用户或服务账号。向该主账号授予集群配置为使用的服务账号(通常是 Managed Service for Apache Spark 虚拟机服务账号)的 Service Account User 角色 (roles/iam.serviceAccountUser)。

  • 操作超时:仅运行 2 个必需的数据节点/节点管理器中的 0 个。

    原因:控制器节点无法创建集群,因为它不能与工作器节点通信。

    解决方案:

  • projects/{projectId}/regions/{region}/subnetworks/{subnetwork} 所需的 compute.subnetworks.use 权限

    原因:当您尝试使用另一个项目中的 VPC 网络设置 Managed Service for Apache Spark 集群并且 Managed Service for Apache Spark Service Agent 服务账号对托管该网络的共享 VPC 项目没有必要的权限时,可能会发生此错误。

    解决方案:按照创建使用另一个项目中的 VPC 网络的集群中列出的步骤。

  • 可用区 projects/zones/{zone} 没有足够的资源来处理请求 (resource type:compute)

    原因:用于创建集群的可用区没有足够的资源。

    解决方案:

    • 使用 Managed Service for Apache Spark 的自动选择可用区展示位置功能,在区域中具有可用资源的任何可用区中创建集群。
    • 在其他可用区中创建集群。
  • 已超出配额错误

    CPUS/CPUS_ALL_REGIONS 配额不足
    “DISKS_TOTAL_GB”配额不足
    “IN_USE_ADDRESSES”配额不足

    原因:您的 CPU磁盘IP 地址请求超出了您的可用配额。

    解决方案:通过 Google Cloud 控制台申请更多配额。

  • 初始化操作失败

    原因:创建集群期间提供的初始化操作安装失败。

    解决方案:

  • 未能初始化节点 CLUSTER-NAME-m。… 请查看以下输出:<gs://PATH_TO_STARTUP_SCRIPT_OUTPUT>

    原因:Managed Service for Apache Spark 集群控制器节点未能初始化。

    解决方案:

  • 集群创建失败:IP 地址空间用尽

    原因:无法提供所请求的集群节点所需的 IP 地址空间。

    解决方案:

    • 创建工作器节点较少但机器类型较大的集群。
    • 在其他子网或网络中创建集群。
    • 减少网络用量以释放 IP 地址空间。
    • 等待网络上有足够的 IP 空间可用。
  • 初始化脚本错误消息:存储库 REPO_NAME 不再有发布文件

    原因:Debian oldstable 向后移植代码库已被清除。

    解决方案:

    在初始化脚本中运行 apt-get 的代码之前添加以下代码。

    oldstable=$(curl -s https://deb.debian.org/debian/dists/oldstable/Release | awk '/^Codename/ {print $2}');
    stable=$(curl -s https://deb.debian.org/debian/dists/stable/Release | awk '/^Codename/ {print $2}');
    
    matched_files="$(grep -rsil '\-backports' /etc/apt/sources.list*)"
    if [[ -n "$matched_files" ]]; then
      for filename in "$matched_files"; do
        grep -e "$oldstable-backports" -e "$stable-backports" "$filename" || \
          sed -i -e 's/^.*-backports.*$//' "$filename"
      done
    fi
    
  • 等待实例 DATAPROC_CLUSTER_VM_NAME 报告超时网络无法访问:dataproccontrol-REGION.googleapis.com

    原因:这些错误消息表明您的 Managed Service for Apache Spark 集群的网络设置不完整:您可能缺少通往默认互联网网关的路由防火墙规则

    解决方案:

    如需排查此问题,您可以创建以下连接测试

    • 在两个 Managed Service for Apache Spark 集群虚拟机之间创建连接测试。此测试的结果将有助于您了解网络的入站流量或出站流量允许防火墙规则是否正确应用于集群虚拟机。
    • 在 Managed Service for Apache Spark 集群虚拟机与当前 Managed Service for Apache Spark 控制 API IP 地址之间创建连接测试。如需获取当前的 Managed Service for Apache Spark 控制 API IP 地址,请使用以下命令:
    dig dataproccontrol-REGION.googleapis.com A
    

    使用输出的回答部分中的任何 IPv4 地址。

    连接测试的结果将帮助您了解通往默认互联网网关的路由和出站流量允许防火墙是否已正确配置。

    根据连接测试的结果:

  • 因更新而出错

    原因:集群接受了提交到 Managed Service for Apache Spark 服务的作业,但无法手动或通过自动扩缩进行扩容或缩容。非标准集群配置也可能会导致此错误。

    解决方案:

    • 集群重置:请提交支持服务工单,附上诊断 tar 文件,并要求将集群重置为“正在运行”状态。

    • 新集群:使用相同配置重新创建集群。此解决方案的速度可能比支持提供的重置更快。

集群问题排查提示

本部分针对可能导致 Managed Service for Apache Spark 集群无法创建的常见问题提供了更多问题排查指导。

当 Managed Service for Apache Spark 集群无法预配时,通常会生成一条一般性错误消息,或者在失败之前报告 PENDINGPROVISIONING 状态。诊断和解决集群故障问题的关键在于检查集群日志并评估常见故障点。

常见症状

以下是与集群创建失败关联的常见症状:

  • 集群状态长时间保持为 PENDINGPROVISIONING
  • 集群转换为 ERROR 状态。
  • 集群创建期间出现的一般 API 错误,例如 Operation timed out
  • 已记录或 API 响应错误消息,例如:

    • RESOURCE_EXHAUSTED:与 CPU、磁盘或 IP 地址配额相关
    • Instance failed to start
    • Permission denied
    • Unable to connect to service_name.googleapis.comCould not reach required Google APIs
    • Connection refusednetwork unreachable
    • 与初始化操作失败相关的错误,例如脚本执行错误和找不到文件。

查看集群日志

诊断集群创建失败问题时,一个重要的初始步骤是查看 Cloud Logging 中提供的详细集群日志。

  1. 前往 Logs Explorer:在 Google Cloud 控制台中打开 Logs Explorer
  2. 过滤 Managed Service for Apache Spark 集群:
    • 资源下拉菜单中,选择 Cloud Managed Service for Apache Spark Cluster
    • 输入您的 cluster_nameproject_id。您还可以按 location(区域)过滤。
  3. 检查日志条目:
    • 查找在集群创建失败时间附近出现的 ERRORWARNING 级消息。
    • 请注意来自 master-startupworker-startupagent 组件的日志,以便深入了解虚拟机级或 Managed Service for Apache Spark 代理问题。
    • 如需深入了解虚拟机启动时出现的问题,请按 resource.type="gce_instance" 过滤日志,并查找与集群节点关联的实例名称(例如 CLUSTER_NAME-mCLUSTER_NAME-w-0)发出的消息。 串行控制台日志可以揭示虚拟机生命周期早期发生的网络配置问题、磁盘问题和脚本失败。

常见的集群故障原因和问题排查提示

本部分概述了 Managed Service for Apache Spark 集群创建可能会失败的常见原因,并提供了一些问题排查提示,以帮助您排查集群故障。

IAM 权限不足

Managed Service for Apache Spark 集群使用的虚拟机服务账号必须具有适当的 IAM 角色,才能预配 Compute Engine 实例、访问 Cloud Storage 存储分区、写入日志以及与其他 Google Cloud 服务互动。

  • 必需的 Worker 角色:验证虚拟机服务账号是否具有 Managed Service for Apache Spark Worker 角色 (roles/dataproc.worker)。此角色具有 Managed Service for Apache Spark 管理集群资源所需的最低权限。
  • 数据访问权限:如果作业从 Cloud Storage 或 BigQuery 读取数据或向其中写入数据,则服务账号需要相关角色,例如 Storage Object ViewerStorage Object CreatorStorage Object Admin (Cloud Storage),或者 BigQuery Data ViewerBigQuery Editor (BigQuery)。
  • 日志记录权限:服务账号必须具有可提供将日志写入 Cloud Logging 所需权限的角色,例如 Logging Writer 角色。

问题排查提示:

  • 确定服务账号:确定集群配置为使用的虚拟机服务账号。如果未指定,则默认为 Compute Engine 默认服务账号

  • 验证 IAM 角色:在 Google Cloud 控制台中,前往 IAM 和管理 > IAM 页面,找到集群虚拟机服务账号,然后验证该账号是否具有集群操作所需的必要角色。授予任何缺失的角色。

超出资源配额

Managed Service for Apache Spark 集群会使用 Compute Engine 和其他 Google Cloud 服务的资源。超出项目或区域配额可能会导致集群创建失败。

  • 需要检查的常见 Managed Service for Apache Spark 配额
    • CPUs(区域)
    • DISKS_TOTAL_GB(区域)
    • IN_USE_ADDRESSES(对于内部 IP,为区域级;对于外部 IP,为全球级)
    • Dataproc API 配额,例如 ClusterOperationRequestsPerMinutePerProjectPerRegion

问题排查提示:

  • 查看配额:前往 Google Cloud 控制台中的 IAM 和管理 > IAM 页面。 按“服务”过滤“Compute Engine API”和“Dataproc API”。
  • 检查使用量与限额的对比情况:确定任何达到或接近限额的配额。
  • 如有必要,请申请增加配额。

网络配置问题

网络配置问题(例如 VPC 网络、子网、防火墙或 DNS 配置不正确)是导致集群创建失败的常见原因。集群实例必须能够彼此通信以及与 Google API 通信。

  • VPC 网络和子网:
    • 验证集群 VPC 网络和子网是否存在且已正确配置。
    • 验证子网是否具有足够的可用 IP 地址范围。
  • 专用 Google 访问通道 (PGA):如果集群虚拟机具有内部 IP 地址,并且需要访问 Google API 以进行 Cloud Storage、Cloud Logging 和其他操作,请验证子网上是否已启用专用 Google 访问通道。默认情况下,使用 2.2 及更高版本映像创建的 Managed Service for Apache Spark 集群会预配具有内部专用 IP 地址的虚拟机,并在集群区域子网上启用专用 Google 访问通道。
  • Private Service Connect (PSC):如果您使用 Private Service Connect 访问 Google API,请验证是否已为 Managed Service for Apache Spark 所依赖的 Google API(例如 dataproc.googleapis.comstorage.googleapis.comcompute.googleapis.comlogging.googleapis.com)正确配置必要的 Private Service Connect 端点。API 的 DNS 条目必须解析为专用 IP 地址。请注意,使用 Private Service Connect 并不意味着无需使用 VPC 对等互连与其他客户管理的 VPC 网络进行通信。
  • VPC 对等互连:如果您的集群与其他 VPC 网络(例如共享 VPC 宿主项目或其他客户 VPC)中的资源通信,请验证 VPC 对等互连是否已正确配置,以及路由是否正在传播。
  • 防火墙规则:

    • 默认规则:验证默认防火墙规则(例如 allow-internalallow-ssh)是否过于严格。
    • 自定义规则:如果已设置自定义防火墙规则,请验证这些规则是否允许所需的通信路径:

      • 集群内的内部通信(在 -m 和 -w 节点之间)。
      • 从集群虚拟机到 Google API 的出站流量,使用公共 IP 或互联网网关、专用 Google 访问通道或 Private Service Connect 端点。

      • 作业所依赖的任何外部数据源或服务的流量。

  • DNS 解析:确认集群实例可以正确解析 Google API 以及任何内部或外部服务的 DNS 名称。

问题排查提示:

  • 查看网络配置:检查集群部署到的 VPC 网络和子网设置。
  • 检查防火墙规则:查看 VPC 网络或共享 VPC 宿主项目中的防火墙规则。
  • 测试连接:在集群子网中启动临时 Compute Engine 虚拟机,然后运行以下步骤:
    • pingcurl 到外部 Google API 网域(例如 storage.googleapis.com)。
    • nslookup,以验证 DNS 解析是否解析为预期的 IP 地址(专用 Google 访问通道或 Private Service Connect)。
    • 运行 Google Cloud 连接测试,以诊断从测试虚拟机到相关端点的路径。

初始化操作失败

Managed Service for Apache Spark 初始化操作是在集群创建期间在集群虚拟机上运行的脚本。这些脚本中的错误可能会阻止集群启动。

问题排查提示:

  • 检查日志中是否存在初始化操作错误:在 Cloud Logging 中查找与集群实例的 init-actionsstartup-script 相关的日志条目。
  • 检查脚本路径和权限:验证初始化操作脚本是否正确位于 Cloud Storage 中,以及集群虚拟机服务账号是否具有读取 Cloud Storage 脚本所需的 Storage Object Viewer 角色。
  • 调试脚本逻辑:在模拟集群环境的单独 Compute Engine 虚拟机上测试脚本逻辑,以识别错误。向脚本添加详细日志记录。

区域级资源可用性(缺货)

有时,某个区域或可用区中的机器类型或资源会暂时不可用(缺货)。通常,这会导致出现与项目配额问题无关的 RESOURCE_EXHAUSTED 错误。

问题排查提示:

  • 尝试其他可用区或区域:尝试在同一区域内的其他可用区或在其他区域中创建集群。
  • 使用自动选择可用区展示位置:使用 Managed Service for Apache Spark 自动选择可用区展示位置功能自动选择具有容量的可用区。
  • 调整机器类型:如果使用的是自定义或专用机器类型,请尝试使用标准机器类型,看看是否能解决问题。

与 Cloud Customer Care 团队联系

如果您仍然遇到集群故障问题,请与 Cloud Customer Care 联系。描述集群故障问题以及采取的问题排查步骤。此外,请提供以下信息:

  • 集群诊断数据
  • 以下命令的输出:
      gcloud dataproc clusters describe CLUSTER_NAME \
          --region=REGION
      
  • 导出的失败集群日志。

使用 gcpdiag 工具

gcpdiag 是一种开源工具,不是官方支持的 Google Cloud 产品。您可以使用 gcpdiag 工具来帮助识别和修复 Google Cloud项目问题。如需了解详情,请参阅 GitHub 上的 gcpdiag 项目

gcpdiag 工具通过执行以下检查帮助您发现 Managed Service for Apache Spark 集群创建中的问题:

  • 缺货错误:评估 Logs Explorer 日志,发现区域和可用区中的缺货情况。
  • 配额不足:检查 Managed Service for Apache Spark 集群项目中的配额可用情况。
  • 网络配置不完整:执行网络连接测试,包括检查必要的防火墙规则以及外部和内部 IP 配置。如果集群已被删除,gcpdiag 工具将无法执行网络连接检查。
  • 跨项目配置不正确:检查跨项目服务账号,并审核其他角色和组织政策执行情况。
  • 缺少共享虚拟私有云网络 IAM 角色:如果 Managed Service for Apache Spark 集群使用共享 VPC 网络,请检查是否已添加所需的服务账号角色。
  • 初始化操作失败:评估 Logs Explorer 日志以发现初始化操作脚本失败和超时。

如需查看 gcpdiag Dataproc 步骤(包括集群创建步骤)的列表,请参阅 Managed Service for Apache Spark 步骤

运行 gcpdiag 命令

您可以在Google Cloud 控制台中或 Docker 容器内通过 Cloud Shell 运行 gcpdiag 命令。

Google Cloud 控制台

  1. 完成然后复制以下命令。
  2. gcpdiag runbook managed-spark/cluster-creation \
        --parameter project_id=PROJECT_ID \
        --parameter cluster_name=CLUSTER_NAME \
        --parameter OPTIONAL_FLAGS
  3. 打开 Google Cloud 控制台并激活 Cloud Shell。
  4. 打开 Cloud 控制台
  5. 粘贴复制的命令。
  6. 运行 gcpdiag 命令以下载 gcpdiag Docker 映像,然后执行诊断检查。如果适用,请按照输出说明修复失败的检查。

Docker

您可以使用封装容器运行 gcpdiag,以在 Docker 容器中启动 gcpdiag。必须安装 Docker 或 Podman

  1. 在本地工作站上复制并运行以下命令。
    curl https://gcpdiag.dev/gcpdiag.sh >gcpdiag && chmod +x gcpdiag
  2. 执行 gcpdiag 命令:
    ./gcpdiag runbook managed-spark/cluster-creation \
        --parameter project_id=PROJECT_ID \
        --parameter cluster_name=CLUSTER_NAME \
        --parameter OPTIONAL_FLAGS

查看此 Runbook 的可用参数

替换以下内容:

    • PROJECT_ID:资源所在项目的 ID
    • CLUSTER_NAME:项目中目标 Managed Service for Apache Spark 集群的名称
    • OPTIONAL_PARAMETERS:添加以下一个或多个可选参数。如果集群已被删除,则必须提供这些参数。
      • cluster_uuid:项目中目标 Managed Service for Apache Spark 集群的 UUID
      • service_account:Managed Service for Apache Spark 集群虚拟机服务账号
      • subnetwork:Managed Service for Apache Spark 集群子网完整 URI 路径
      • internal_ip_only:判断正误
      • cross_project:如果 Managed Service for Apache Spark 集群使用的是另一个项目中的虚拟机服务账号,则为跨项目 ID

实用标志:

如需查看所有 gcpdiag 工具标志的列表和说明,请参阅 gcpdiag 使用说明

后续步骤