Dataproc中PySpark无法读取归档文件问题排查求助
问题根源
Dataproc的--archives参数会将压缩包解压到当前工作目录下以压缩包basename(去掉.zip后缀)命名的子目录中,但如果压缩包内部目录结构与代码预期不匹配、路径引用错误,或者Batch模式下驱动节点工作目录的路径差异,就会触发文件找不到的报错。
解决方案
1. 确认压缩包内部结构
先检查resources.zip的目录结构是否符合代码预期:
- 执行命令查看压缩包内容:
确保输出中存在unzip -l dist/resources.zipresources/config/configuration.yaml(即压缩包根目录为resources,内部包含config子目录)。如果压缩包内部直接是config/configuration.yaml(无外层resources目录),需重新打包:cd dist zip -r resources.zip resources/
2. 给压缩包指定别名明确路径
在gcloud命令中为--archives的压缩包添加别名,避免路径歧义:
修改参数为:
--archives dist/resources.zip#resources
此配置会强制将压缩包解压到当前工作目录下的resources子目录,与代码中的路径直接匹配。
3. 加入调试代码定位实际路径
若仍报错,在spark_script.py开头添加调试代码,明确文件的实际位置:
import os # 打印当前工作目录 print("Current working directory:", os.getcwd()) # 打印当前目录内容 print("Directory contents:", os.listdir("./")) # 检查resources目录内容(若存在) if os.path.exists("./resources"): print("Resources directory contents:", os.listdir("./resources"))
运行任务后查看日志,根据实际路径调整代码中的文件引用。
4. 使用SparkFiles工具获取可靠路径
如果相对路径始终有问题,改用Spark提供的SparkFiles工具获取分布式文件的本地路径:
from pyspark import SparkFiles import yaml import os # 获取解压后的resources目录路径 resources_dir = SparkFiles.get("resources") config_path = os.path.join(resources_dir, "config/configuration.yaml") with open(config_path, "r") as f: YAML_CONFIG = yaml.load(f, yaml.SafeLoader)
SparkFiles.get()会自动返回文件在节点本地的正确路径,规避工作目录差异问题。
验证流程
- 重新打包符合结构要求的
resources.zip - 更新
gcloud命令的--archives参数添加别名 - 加入调试代码确认文件路径
- 运行Batch任务,查看日志验证文件是否能正常读取
内容的提问来源于stack exchange,提问作者Tom J Muthirenthi
相关产品推荐
相关产品推荐

