一尘不染

我似乎无法在Spark上使用--py文件

python

我在Spark上使用Python时遇到问题。我的应用程序具有一些依赖项,例如numpy,pandas,astropy等。我无法使用virtualenv创建具有所有依赖项的环境,因为群集上的节点除HDFS外没有任何公共的挂载点或文件系统。因此,我坚持使用spark- submit --py-files。我将站点程序包的内容打包到一个ZIP文件中,然后提交与--py- files=dependencies.zipoption一样的作业(如在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时,一切正常,因此依赖项就在那里。有谁知道,什么可能导致此问题以及如何解决?

谢谢!


阅读 302

收藏
2020-12-20

共1个答案

一尘不染

为了使这种依赖分发方法能够与编译扩展一起使用,我们需要做两件事:

  1. 在与目标集群相同的操作系统上运行pip install(最好在集群的主节点上)。这样可确保兼容的二进制文件包含在您的zip中。
  2. 将归档文件解压缩到目标节点上。这是必需的,因为Python不会从zip文件导入已编译的扩展名。(https://docs.python.org/3.8/library/zipimport.html

使用以下脚本创建依赖项zip将确保您与系统上已安装的任何软件包隔离。假设已安装virtualenvrequirements.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
包括depsPYTHONPATH中用于主服务器和所有工作程序的目录

--deploy-mode集群
集群上 运行主执行器,因此可以选择依赖项

2020-12-20