运送和在pyspark作业中使用virtualenv

Don*_*tal 5 numpy virtualenv pyspark

问题:我正在尝试从本地计算机向计算机集群运行火花提交脚本。集群完成的工作使用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
Run Code Online (Sandbox Code Playgroud)

详细信息:在我的本地环境中,我设置了一个virtualenv,其中包括numpy以及我在项目和其他各种库中使用的私有存储库。我从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
Run Code Online (Sandbox Code Playgroud)

我也知道在远程节点上有一个/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
Run Code Online (Sandbox Code Playgroud)

当我运行脚本时,出现上述错误。如果我丝网印刷install_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()
Run Code Online (Sandbox Code Playgroud)

期望/我的想法:我希望这能正确导入numpy,尤其是因为我知道numpy在本地virtualenv中可以正常工作。我怀疑这是因为我实际上没有使用远程节点上virtualenv中安装的python版本。我的问题是,首先,我该如何解决此问题,其次,我该如何在远程节点上使用我在virtualenv上安装的python,而不是仅在这些计算机上手动安装的python?我已经看到了一些有关此方面的文章,但坦率地说,它们的书写方式不佳。

Tw *_*Nus 5

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

--conf spark.yarn.appMasterEnv.PYSPARK_PYTHON
Run Code Online (Sandbox Code Playgroud)

此外,我想您应该使您的virtualenv 可重定位(但是,这是实验性的)。<edit 20170908>这意味着 virtualenv 使用相对而不是绝对链接。</edit>

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

<edit 20170908>

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

关于--archivesvs. --py-files

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

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

  • --archives 意味着这些被提取到每个执行程序的工作目录中(仅纱线簇)。

但是,在我看来,缺乏明确的区别 - 例如,请参阅此 SO post

在给定的情况下,添加anaconda.zipvia--archives和您的“其他 python 文件” via --py-files

</edit>

另请参阅:使用 Virtualenv 运行 Pyspark, Henning Kropp 的博客文章。