问题:我正在尝试将Spark-Submit脚本从本地计算机运行到一组机器。集群完成的工作使用Numpy。我目前会收到以下错误:
ImportError:
Importing the multiarray numpy extension module failed. Most
likely you are trying to import a failed build of numpy.
If you're working with a numpy git repo, try `git clean -xdf` (removes all
files not under version control). Otherwise reinstall numpy.
Original error was: cannot import name multiarray
细节:在我的本地环境中,我设置了一个Virtualenv,其中包括Numpy以及我在项目和其他各种库中使用的私人回购。我从venv/lib/site包装的站点包装目录中创建了一个zip文件(lib/libs.zip),其中" VENV"是我的虚拟环境。我将这个拉链运送到遥控节点。我用于执行Spark-Submit的外壳脚本看起来像这样:
$SPARK_HOME/bin/spark-submit
--deploy-mode cluster
--master yarn
--conf spark.pyspark.virtualenv.enabled=true
--conf spark.pyspark.virtualenv.type=native
--conf spark.pyspark.virtualenv.requirements=${parent}/requirements.txt
--conf spark.pyspark.virtualenv.bin.path=${parent}/venv
--py-files "${parent}/lib/libs.zip"
--num-executors 1
--executor-cores 2
--executor-memory 2G
--driver-memory 2G
$parent/src/features/pi.py
我还知道,在远程节点上有a/usr/local/bin/python2.7文件夹,其中包含python 2.7安装。
所以在我的conf/spark-env.sh中,我设置了以下内容:
export PYSPARK_PYTHON=/usr/local/bin/python2.7
export PYSPARK_DRIVER_PYTHON=/usr/local/bin/python2.7
运行脚本时,我会收到上面的错误。如果我屏幕屏幕打印inportaed_distributions,我将获得零长度列表[]。我的私人图书馆也正确地导入了(对我说,它实际上是在访问我的libs.zip网站包装。)。我的pi.py文件看起来像这样:
from myprivatelibrary.bigData.spark import spark_context
spark = spark_context()
import numpy as np
spark.parallelize(range(1, 10)).map(lambda x: np.__version__).collect()
期望/我的想法:我希望这将正确导入Numpy,尤其是因为我知道Numpy在本地Virtualenv中正确起作用。我怀疑这是因为我实际上并未使用远程节点上Virtualenv中安装的Python版本。我的问题首先是,我该如何修复此问题,其次如何使用远程节点上安装的python而不是手动安装并目前坐在这些机器上的python?我已经看到了一些文章,但坦率地说,它们写得不好。
使用--conf spark.pyspark.{}
和export PYSPARK_PYTHON=/usr/local/bin/python2.7
,您为本地环境/驱动程序设置了选项。要设置群集(执行者)的选项,请使用以下语法:
--conf spark.yarn.appMasterEnv.PYSPARK_PYTHON
此外,我想您应该使您的Virtualenv重新定位(但是,这是实验性的)。 <edit 20170908>
这意味着Virtualenv使用相对而不是绝对链接。 </edit>
我们在这种情况下所做的:我们在HDFS上运送了整个Anaconda分布。
<edit 20170908>
如果我们谈论的是不同的环境(如下注释中提到的MacOS vs. Linux),您不能仅提交Virtualenv,至少如果您的Virtualenv包含带有二进制文件的软件包(如numpy的情况)。在这种情况下,我建议您创建一个"便携式" anaconda,即在Linux VM中安装Anaconda并将其拉链。
关于--archives
与--py-files
:
--py-files
将Python文件/软件包添加到Python路径。来自Spark-Submit文档:对于Python应用程序,只需将.py文件代替而不是JAR传递,然后将Python .zip,.egg或.py Files添加到搜索路径中。
--archives
意味着将它们提取到每个执行人的工作目录中(只有纱线簇)。
但是,我认为缺少一个清晰的区别 - 例如,请参见此帖子。
在给定情况下,通过--archives
添加anaconda.zip
,以及您的"其他Python文件",通过--py-files
。
</edit>
另请参见:使用Virtualenv运行Pyspark,这是Henning Kropp的博客文章。