PySpark提交zip格式py-files时报java.io.FileNotFoundException错误
问题根因
你遇到的报错核心是Spark对带查询参数的HTTP资源链接做了自动URL编码,导致请求的资源地址无效:
- 从异常栈可以看到实际Spark请求的地址为
https://github.com/LorenzWackenhut/py-files-public/blob/main/jobs.zip%3Fraw=true,你原本传入的查询参数标识?被编码为%3F,GitHub无法识别该格式的请求,返回404错误,Spark因此抛出FileNotFoundException。 - Spark的
--py-files、--files参数处理HTTP链接时,默认会将链接中所有非路径标准字符做转义,查询参数的?、&等符号都会被编码,导致原始请求失效。
解决办法
方案1:改用GitHub raw直链(推荐)
GitHub的静态资源支持不带查询参数的raw域名直链,格式为https://raw.githubusercontent.com/用户名/仓库名/分支名/文件路径,替换你提交命令中的--py-files参数值即可,不需要携带?raw=true后缀:
# 替换后的提交命令对应行 --py-files "https://raw.githubusercontent.com/LorenzWackenhut/py-files-public/main/jobs.zip"
方案2:本地下载后提交
如果不想处理HTTP链接的适配问题,直接将所有依赖文件提前下载到提交任务的本地节点,提交命令直接使用本地路径即可完全规避URL编码问题:
# 先下载所需文件到本地 wget https://raw.githubusercontent.com/config.yml wget https://raw.githubusercontent.com/LorenzWackenhut/py-files-public/main/jobs.zip wget https://raw.githubusercontent.com/main.py # 提交任务使用本地路径 $SPARK_HOME/bin/spark-submit \ --master local[*] \ --deploy-mode client \ --name spark-python \ --conf spark.driver.memory=4g \ --files config.yml \ --py-files jobs.zip \ main.py
内容的提问来源于stack exchange,提问作者Lorenz
相关产品推荐
相关产品推荐

