运输和使用Virtualenv在Pyspark工作中



问题:我正在尝试将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的博客文章。

最新更新