我似乎无法在Spark上使用--py文件
我在Spark上使用Python时遇到问题。我的应用程序具有一些依赖项,例如numpy,pandas,astropy等。我无法使用virtualenv创建具有所有依赖项的环境,因为群集上的节点除HDFS外没有任何公共的挂载点或文件系统。因此,我坚持使用spark-
submit --py-files
。我将站点程序包的内容打包到一个ZIP文件中,然后提交与--py-
files=dependencies.zip
option一样的作业(如在Spark
executor节点上安装Python依赖项的最简单方法中建议的那样)。但是,群集上的节点似乎仍然看不到内部模块,并且ImportError
在导入numpy时会抛出此类错误。
File "/path/anonymized/module.py", line 6, in <module>
import numpy
File "/tmp/pip-build-4fjFLQ/numpy/numpy/__init__.py", line 180, in <module>
File "/tmp/pip-build-4fjFLQ/numpy/numpy/add_newdocs.py", line 13, in <module>
File "/tmp/pip-build-4fjFLQ/numpy/numpy/lib/__init__.py", line 8, in <module>
#
File "/tmp/pip-build-4fjFLQ/numpy/numpy/lib/type_check.py", line 11, in <module>
File "/tmp/pip-build-4fjFLQ/numpy/numpy/core/__init__.py", line 14, in <module>
ImportError: cannot import name multiarray
当我切换到virtualenv并使用本地pysparkshell时,一切正常,因此依赖项就在那里。有谁知道,什么可能导致此问题以及如何解决?
谢谢!
-
为了使这种依赖分发方法能够与编译扩展一起使用,我们需要做两件事:
- 在与目标集群相同的操作系统上运行pip install(最好在集群的主节点上)。这样可确保兼容的二进制文件包含在您的zip中。
- 将归档文件解压缩到目标节点上。这是必需的,因为Python不会从zip文件导入已编译的扩展名。(https://docs.python.org/3.8/library/zipimport.html)
使用以下脚本创建依赖项zip将确保您与系统上已安装的任何软件包隔离。假设已安装virtualenv
requirements.txt
并存在于当前目录中,并dependencies.zip
在根级别输出包含所有依赖项的a
。env_name=temp_env # create the virtual env virtualenv --python=$(which python3) --clear /tmp/${env_name} # activate the virtual env source /tmp/${env_name}/bin/activate # download and install dependencies pip install -r requirements.txt # package the dependencies in dependencies.zip. the cd magic works around the fact that you can't specify a base dir to zip (cd /tmp/${env_name}/lib/python*/site-packages/ && zip -r - *) > dependencies.zip
现在就可以部署,解压缩依赖项并将其包含在PYTHONPATH中
spark-submit \ --master yarn \ --deploy-mode cluster \ --conf 'spark.yarn.dist.archives=dependencies.zip#deps' \ --conf 'spark.yarn.appMasterEnv.PYTHONPATH=deps' \ --conf 'spark.executorEnv.PYTHONPATH=deps' \ . . .
spark.yarn.dist.archives = dependencies.zip#deps
分发您的zip文件并将其解压缩到一个名为deps
spark.yarn.appMasterEnv.PYTHONPATH = deps
spark.executorEnv.PYTHONPATH = deps
包括deps
PYTHONPATH中用于主服务器和所有工作程序的目录--deploy-mode集群
在 集群上 运行主执行器,因此可以选择依赖项