GCP Dataproc Serverless PySpark作业失败及网络配置疑问求助
问题描述
首次运行GCP Dataproc Serverless PySpark批处理作业,作业需连接公网REST端点并写入同项目下的GCS存储桶。提交后作业长时间处于PENDING状态,随后失败并报错:
StructuredError{spark, Timed out waiting for at least 1 worker(s) registered. This is often caused by firewall rules that prevent Spark workers from communicating with the master. Please review your network firewall rules and be sure they allow communication on all ports between all nodes.
用户疑问
- 无法理解官方指南中
Open subnet connectivity章节的作用 - 主节点与工作节点是否运行在GCP管理的独立VPC中?为何需要关注它们之间的连通性?
- 指南中给出的防火墙规则命令里的
network-name和SUBNET_RANGES应如何填写?
问题解答
核心原因
这个报错的本质是Spark主节点无法与工作节点建立通信,导致作业无法调度执行,最终超时失败。
1. Open subnet connectivity章节的作用
该章节要求配置子网内的全量连通性,目的是让Dataproc Serverless创建的Spark主节点、工作节点之间能不受限制地通信——Spark集群内部需要通过大量端口完成任务调度、数据传输、状态同步等操作,没有全量连通性的话,节点间会出现通信阻塞,直接导致作业无法启动。
2. 主节点与工作节点的VPC归属及连通性必要性
- Dataproc Serverless的节点不会运行在GCP管理的独立VPC,而是运行在你指定的项目VPC子网中(未指定则使用默认VPC)。
- 必须关注它们的连通性:Spark是主从架构,主节点负责分发任务、监控状态,工作节点负责执行任务,两者之间需要实时通信。如果防火墙阻断了节点间的流量,主节点找不到工作节点,作业就会一直Pending直到超时失败。
3. 防火墙规则命令参数填写说明
给出的命令用于创建允许子网内部入站流量的规则,参数填写方式如下:
network-name:填写你的VPC网络名称,比如默认VPC就是default,自定义VPC则填写你自己设置的名称。SUBNET_RANGES:填写作业使用的子网IP地址范围(CIDR格式),比如子网CIDR为10.0.0.0/24就填这个值;如果涉及多个子网,用逗号分隔多个CIDR。
示例命令(假设使用默认VPC,子网CIDR为10.0.0.0/24):
gcloud compute firewall-rules create allow-internal-ingress \ --network=default \ --source-ranges=10.0.0.0/24 \ --direction=ingress \ --action=allow \ --rules=all
额外说明:你的作业需要访问公网和GCS,还需确保VPC有对应的公网访问配置(比如启用Cloud NAT或子网分配外部IP),但当前报错核心是内部连通性,优先解决该问题后再排查其他配置。
内容的提问来源于stack exchange,提问作者Averell

