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?我已经看到了一些有关此方面的文章,但坦率地说,它们的书写方式不佳。
使用--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 的博客文章。
| 归档时间: |
|
| 查看次数: |
4704 次 |
| 最近记录: |