GCP Dataproc上Spark-submit多模式运行异常问题求助
GCP Dataproc集群Spark运行异常排查方案
场景1:本地模式正常运行
本地模式下通过setMaster("local[*]")配置SparkConf,执行spark-submit运行JAR无问题,说明代码逻辑本身无错误,异常均来自集群环境配置或资源访问问题。
场景2:Standalone模式下MetricsSystem初始化失败
问题现象
配置Standalone模式SparkConf(指定master地址、资源参数等)后,执行spark-submit出现Master无响应,核心错误日志:
java.lang.IllegalArgumentException: requirement failed: Can only call getServletHandlers on a running MetricsSystem
解决步骤
- 对齐Spark版本:确保本地编译JAR使用的Spark版本与Dataproc集群预装的Spark版本完全一致,版本不匹配会导致Metrics组件初始化逻辑冲突。
- 移除代码硬编码配置:不要在代码中硬编码
setMaster、资源参数(如setExecutorMemory),改用spark-submit命令行参数指定,例如:
Dataproc的Standalone集群有默认配置,代码硬编码会覆盖集群配置引发异常。spark-submit --master spark://<dataproc-master-ip>:7077 --executor-memory 4g your-app.jar - 禁用自定义Metrics配置:如果代码中自定义了MetricsSystem相关配置,暂时注释掉,改用Dataproc集群默认的Metrics监控组件,避免初始化流程冲突。
场景3:YARN模式下文件路径不存在
问题现象
切换到YARN模式后,仅设置应用名称的SparkConf,执行spark-submit后作业被接受但无法运行,核心错误日志:
java.io.FileNotFoundException: /home/aavashbhandari/dataset/California_Edges.txt (No such file or directory)
解决步骤
- 上传文件到GCS分布式存储:Dataproc的YARN集群中,Executor节点无法访问Master节点或本地机器的本地文件系统,必须将数据集上传到Google Cloud Storage(GCS),代码中使用GCS路径访问,例如:
// 替换本地路径为GCS路径 val df = spark.read.text("gs://your-bucket-name/dataset/California_Edges.txt") - 验证文件与权限:用
gsutil ls gs://your-bucket-name/dataset/California_Edges.txt确认文件存在,同时检查Dataproc集群服务账号是否有该GCS Bucket的访问权限(默认服务账号具备基础访问权限,自定义权限需检查IAM配置)。 - 避免本地路径依赖:永远不要在分布式集群模式下使用本地绝对路径,所有依赖文件必须放在分布式存储(GCS、HDFS等)中,确保所有Executor节点都能访问。
内容的提问来源于stack exchange,提问作者Aavash Bhandari
相关产品推荐
相关产品推荐

