在pyspark工作中运送和使用virtualenv

时间:2017-09-07 00:29:37

标签: numpy pyspark virtualenv

问题:我正在尝试从本地计算机运行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

DETAIL: 在我的本地环境中,我设置了一个virtualenv,包括我在项目和其他各种库中使用的numpy和私有repo。我在venv / lib / site-packages的site-packages目录中创建了一个zip文件(lib / libs.zip),其中' venv'是我的虚拟环境。我将此zip发送到远程节点。我执行spark-submit的shell脚本如下所示:

$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

我也知道在远程节点上有一个包含python 2.7安装的/usr/local/bin/python2.7文件夹。

所以在我的conf / spark-env.sh中我设置了以下内容:

export PYSPARK_PYTHON=/usr/local/bin/python2.7
export PYSPARK_DRIVER_PYTHON=/usr/local/bin/python2.7

当我运行脚本时,我得到上面的错误。如果我在屏幕上打印installed_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版本。我的问题是,我如何解决这个问题,第二,如何在远程节点上使用我的virtualenv安装的python,而不是仅仅手动安装并且当前位于这些机器上的python?我已经看过一些关于这方面的文章,但坦率地说,他们写得不好。

1 个答案:

答案 0 :(得分:4)

使用--conf spark.pyspark.{}export PYSPARK_PYTHON=/usr/local/bin/python2.7,您可以为本地环境/驱动程序设置选项。要为集群(执行程序)设置选项,请使用以下语法:

--conf spark.yarn.appMasterEnv.PYSPARK_PYTHON

此外,我猜你应该制作你的virtualenv relocatable(这是实验性的)。 <edit 20170908> 这意味着virtualenv使用相对而不是绝对链接。的 </edit>

我们在这种情况下做了什么:我们通过hdfs发布了整个anaconda发行版。

<强> <edit 20170908>

如果我们谈论的是不同的环境(MacOs与Linux,如下面的评论中所述),你不能只提交virtualenv,至少不是如果你的virtualenv包含带二进制文件的包(就像numpy一样)。在这种情况下,我建议你自己创建一个“便携式”蟒蛇,即在Linux VM中安装Anaconda并压缩它。

关于--archives--py-files

  • --py-files将python文件/包添加到python路径。来自spark-submit documentation

      

    对于Python应用程序,只需传递一个.py文件而不是JAR,并使用--py-files将Python .zip,.egg或.py文件添加到搜索路径中。

  • --archives表示将这些提取到每个执行程序的工作目录中(仅限纱簇)。

然而,在我看来,缺乏清晰的区别 - 例如this SO post

在给定的情况下,通过anaconda.zip添加--archives,通过--py-files添加“其他python文件”。

<强> </edit>

另见:Running Pyspark with Virtualenv,Henning Kropp的博客文章。