You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spark-Submit提交时GCS源码ZIP无法复制到Dataproc集群

GCP Dataproc 提交PySpark作业无法加载ZIP源码包修复方案

核心问题定位

作业抛出ModuleNotFoundError: No module named 'src'的根本原因有两个:

  1. 提交命令存在语法错误:--jars、--archives等参数行末尾缺少续行反斜杠\,导致后续参数全部被截断,根本没有传递给gcloud命令,不管是传archives还是传shell脚本逻辑都没生效
  2. 参数用法完全错误:
    • --archives、--files参数只会把文件分发到节点工作目录,不会自动将路径加入Python模块搜索路径PYTHONPATH,就算参数传对了也识别不到src模块
    • --分隔符后的内容是直接传给PySpark主程序的命令行参数,不是要在节点上执行的shell命令,你写的gsutil复制、解压逻辑从来没有被执行过
    • 命令里重复写了两次--,后面的作业参数也会传参异常

前置校验

先确认你的pyfiles.zip打包结构正确:压缩包打开后根目录直接是src文件夹,不存在额外的外层嵌套目录(比如不要把外层的pyfiles文件夹一起压缩,导致打开压缩包先看到pyfiles文件夹、点进去才看到src,这种结构Python解释器识别不了)。

修复方案(二选一即可)

方案1:用--py-files传依赖(最简便,推荐)

Spark原生支持--py-files参数直接传递Python依赖(支持.zip/.egg/.py格式),会自动把依赖分发到所有driver和executor节点,并且自动加入PYTHONPATH,不需要手动解压。
修复后的可直接运行命令:

gcloud dataproc jobs submit pyspark gs://gcs-bucket/spark-submit/main_file.py \
    --project XYZ-data \
    --cluster=ABC-v1 \
    --region=us-central1 \
    --jars gs://qc-dmart/tmp/gcs-connector-hadoop3-2.2.2-shaded.jar,gs://qc-dmart/tmp/spark-bigquery-with-dependencies_2.12-0.24.2.jar \
    --py-files gs://gcs-bucket/spark-submit/src/pyfiles.zip \
    -- --config-path=../configs env=dev

注意:每一行末尾的续行反斜杠\不能遗漏,否则后面的参数会被命令行截断,完全不生效。

方案2:手动加载依赖(适合有自定义解压/配置需求的场景)

如果需要自定义依赖拉取、解压逻辑,不要把shell命令写在提交参数里,直接在主Python文件最顶部(所有src相关导入语句之前)加如下代码:

import os
import sys
import subprocess

# 手动拉取并解压源码包
subprocess.run(
    ["gsutil", "cp", "gs://gcs-bucket/spark-submit/src/pyfiles.zip", "."],
    check=True
)
subprocess.run(["unzip", "-n", "pyfiles.zip"], check=True)
# 把当前工作目录加入Python模块搜索路径
sys.path.append(os.getcwd())

提交命令去掉无效的shell参数段即可:

gcloud dataproc jobs submit pyspark gs://gcs-bucket/spark-submit/main_file.py \
    --project XYZ-data \
    --cluster=ABC-v1 \
    --region=us-central1 \
    --jars gs://qc-dmart/tmp/gcs-connector-hadoop3-2.2.2-shaded.jar,gs://qc-dmart/tmp/spark-bigquery-with-dependencies_2.12-0.24.2.jar \
    -- --config-path=../configs env=dev

之前尝试无效的原因

  • 单独使用--archives/--files:一方面命令缺续行符导致参数没传进去,另一方面就算传对了,这两个参数不会自动配置PYTHONPATH,Python解释器还是找不到src模块
  • 在--后写gsutil命令:这部分内容会被当做命令行参数传给main_file.py,不会被shell执行,解压逻辑根本没跑

内容的提问来源于stack exchange,提问作者Jack Daniel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 08:48:31