将spark集群配置为spark-standalone,我们正在尝试配置spark-submit作业以利用pipenv管理的虚拟环境。
该项目具有以下结构:
project/
|-- .venv/
|--bin/python
|--lib/python3.6/site-packages
|-- src/
|-- app.py
当前尝试涉及压缩虚拟环境(zip -r site.zip .venv
)以包含python可执行文件和所有站点包,并将其传递给执行程序。
目前提供spark-submit命令:
PYSPARK_DRIVER_PYTHON=./.venv/bin/python \
spark-submit --py-files site.zip src/app.py
我们的想法是--py-files
参数应该将site.zip解压缩到执行程序的工作目录中,.venv
应该使用.venv/bin/python
和site-packages进行复制在python路径上。显然不是这种情况,因为我们收到错误:
org.apache.spark.SparkException: Job aborted due to stage failure:
Task 0 in stage 0.0 failed 4 times, most recent failure: Lost task
0.3 in stage 0.0 (TID 3, [executor-node-uri], executor 0):
java.io.IOException: Cannot run program "./.venv/bin/python":
error=2, No such file or directory
我的问题是:我们对--py-files
的理解是否正确?我尝试浏览spark源代码,但在它是zip文件的情况下无法跟随--py-files
参数的流程。在spark-submit中有很多关于YARN模式和运输conda环境的教程,但在spark独立版上却没有太多内容;这甚至可能吗?
附录::这些是我正在学习的YARN教程: https://henning.kropponline.de/2016/09/17/running-pyspark-with-virtualenv/
答案 0 :(得分:0)
-py-files选项不会解压缩您提供的zip文件。 python可以使用zip文件中的软件包的原因是因为python直接支持zip。但是,如果Python二进制文件本身以这种方式打包,那么Spark将无法找到它。
相反,要实现此目的,您应该使用(详细记录的)--archives
选项,该选项会将您提供的归档文件解压缩到您指定的目录:
PYSPARK_DRIVER_PYTHON=./.venv/bin/python \
spark-submit \
--archives site.zip#.venv \
src/app.py
怪异的#
语法用于指定输出目录documented here。
编辑:还有一本关于使用venv-pack
来实现here相同功能的教程,尽管您正在做的事情应该已经可以工作。