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

Dataproc中PySpark无法读取归档文件问题排查求助

问题根源

Dataproc的--archives参数会将压缩包解压到当前工作目录下以压缩包basename(去掉.zip后缀)命名的子目录中,但如果压缩包内部目录结构与代码预期不匹配、路径引用错误,或者Batch模式下驱动节点工作目录的路径差异,就会触发文件找不到的报错。

解决方案

1. 确认压缩包内部结构

先检查resources.zip的目录结构是否符合代码预期:

  • 执行命令查看压缩包内容:
    unzip -l dist/resources.zip
    
    确保输出中存在resources/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()会自动返回文件在节点本地的正确路径,规避工作目录差异问题。

验证流程
  1. 重新打包符合结构要求的resources.zip
  2. 更新gcloud命令的--archives参数添加别名
  3. 加入调试代码确认文件路径
  4. 运行Batch任务,查看日志验证文件是否能正常读取

内容的提问来源于stack exchange,提问作者Tom J Muthirenthi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 15:45:33