运行Spark作业时出现java.io.FileNotFoundException的原因排查
Spark作业提交失败排查:FileNotFoundException(Spark Job History目录缺失)
提交命令
gcloud dataproc jobs submit spark \ --cluster=clusterName \ --class=clazzName \ --jars=gs://abc/def/ghi.jar \ --region=us-central1 \ --files=gs://abc/def/jkl.json \ --properties=spark.driver.extraJavaOptions="-Dconfig.file=application_dev.json",spark.executor.extraJavaOptions="-Dconfig.file=application_dev.json",spark.executor.memory=6G,spark.driver.memory=4G,spark.executor.cores=3,spark.executor.instances=4
核心错误信息
ERROR org.apache.spark.SparkContext: Error initializing SparkContext. java.io.FileNotFoundException: File not found: gs://temp-bucket/f80f8cb3-0358-445e-8ec2-819e4282bfe4/spark-job-history
原因分析
- 事件日志目录不存在:Spark默认启用事件日志记录,但指定的GCS目录
gs://temp-bucket/.../spark-job-history未创建,且Spark无法自动生成该路径。 - 权限不足:Dataproc集群的服务账号没有对
temp-bucket的写入/目录创建权限,导致无法初始化日志目录。 - 配置冲突:作业代码或集群全局配置中指定了无效的事件日志路径,且未开启自动创建目录的参数。
解决方法
方法1:手动创建缺失目录
通过GCS控制台或gsutil命令创建目标目录:
# 创建具体的日志目录 gsutil mkdir gs://temp-bucket/f80f8cb3-0358-445e-8ec2-819e4282bfe4/spark-job-history # 若为动态生成的UUID目录,直接创建父桶目录即可 gsutil mkdir gs://temp-bucket/
方法2:修改Spark配置,自动创建目录
提交作业时添加自动修复目录的参数,同时指定合法的日志路径:
gcloud dataproc jobs submit spark \ --cluster=clusterName \ --class=clazzName \ --jars=gs://abc/def/ghi.jar \ --region=us-central1 \ --files=gs://abc/def/jkl.json \ --properties=spark.driver.extraJavaOptions="-Dconfig.file=application_dev.json",spark.executor.extraJavaOptions="-Dconfig.file=application_dev.json",spark.executor.memory=6G,spark.driver.memory=4G,spark.executor.cores=3,spark.executor.instances=4,spark.eventLog.dir=gs://temp-bucket/spark-job-history,spark.eventLog.enabled=true,spark.hadoop.fs.gs.implicit.dir.repair=true
其中spark.hadoop.fs.gs.implicit.dir.repair=true会让GCS文件系统自动创建缺失的目录。
方法3:修复Dataproc服务账号权限
确保Dataproc集群的服务账号(格式通常为service-<project-number>@gcp-sa-dataproc.iam.gserviceaccount.com)拥有roles/storage.objectAdmin或对temp-bucket的单独写入权限:
- 打开GCP控制台IAM页面
- 找到对应服务账号,为其添加存储桶的写入权限
方法4:临时禁用事件日志
若不需要作业历史记录,可直接关闭事件日志功能:
gcloud dataproc jobs submit spark \ --cluster=clusterName \ --class=clazzName \ --jars=gs://abc/def/ghi.jar \ --region=us-central1 \ --files=gs://abc/def/jkl.json \ --properties=spark.driver.extraJavaOptions="-Dconfig.file=application_dev.json",spark.executor.extraJavaOptions="-Dconfig.file=application_dev.json",spark.executor.memory=6G,spark.driver.memory=4G,spark.executor.cores=3,spark.executor.instances=4,spark.eventLog.enabled=false
内容的提问来源于stack exchange,提问作者Aditya Mahajan
相关产品推荐
相关产品推荐

