我在Spark上使用Python时遇到问题。我的应用程序具有一些依赖项,例如numpy,pandas,astropy等。我无法使用virtualenv创建具有所有依赖项的环境,因为群集上的节点除HDFS外没有任何公共的挂载点或文件系统。因此,我坚持使用spark- submit --py-files。我将站点程序包的内容打包到一个ZIP文件中,然后提交与--py- files=dependencies.zipoption一样的作业(如在Spark executor节点上安装Python依赖项的最简单方法中建议的那样)。但是,群集上的节点似乎仍然看不到内部模块,并且ImportError在导入numpy时会抛出此类错误。
spark- submit --py-files
--py- files=dependencies.zip
ImportError
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时,一切正常,因此依赖项就在那里。有谁知道,什么可能导致此问题以及如何解决?
谢谢!
为了使这种依赖分发方法能够与编译扩展一起使用,我们需要做两件事:
使用以下脚本创建依赖项zip将确保您与系统上已安装的任何软件包隔离。假设已安装virtualenvrequirements.txt并存在于当前目录中,并dependencies.zip在根级别输出包含所有依赖项的a 。
requirements.txt
dependencies.zip
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
deps
spark.yarn.appMasterEnv.PYTHONPATH = deps spark.executorEnv.PYTHONPATH = deps 包括depsPYTHONPATH中用于主服务器和所有工作程序的目录
--deploy-mode集群 在 集群上 运行主执行器,因此可以选择依赖项