当前位置: 首页 > 知识库问答 >
问题:

在pyspark作业中运输和使用虚拟环境

令狐嘉运
2023-03-14

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

详细信息:在我的本地环境中,我设置了一个VirtualNV,其中包括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

我还知道,在远程节点上有一个/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

当我运行脚本时,我得到上面的错误。如果我用屏幕打印安装的_发行版,我会得到一个零长度列表[]。而且我的私有库导入正确(这对我来说,它实际上是在访问我的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在我的本地VirtualTV中工作正常。我怀疑这是因为我实际上没有使用安装在远程节点上的virtualenv中的python版本。我的问题是,首先,如何解决这个问题;其次,如何在远程节点上使用virtualenv安装的python,而不是那些机器上手动安装的python?我看过一些关于这方面的评论,但坦率地说,它们写得不好。

共有1个答案

赫连冠玉
2023-03-14

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

--conf spark.yarn.appMasterEnv.PYSPARK_PYTHON

此外,我想你应该让你的VirtualNV重新定位(不过这是实验性的)<代码>

我们在这种情况下所做的:我们通过hdfs运送了整个anaconda分发版。

如果我们讨论的是不同的环境(MacOS与Linux,如下面的评论所述),您不能只提交一个虚拟环境,至少如果您的虚拟环境包含带有二进制文件的包(就像Numpy一样)。在这种情况下,我建议您创建一个“便携式”蟒蛇,即在Linux虚拟机中安装蟒蛇并压缩它。

关于-档案vs.-py-file

>

  • --py files将python文件/包添加到python路径。从spark提交文档:

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

    --归档文件表示将这些文件提取到每个执行器的工作目录中(仅纱线簇)。

    然而,在我看来,缺乏一个清晰的区别——例如,请看这篇SO帖子。

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

    另请参见:与Virtualenv一起运行Pyspark,这是Henning Kropp的一篇博文。

  •  类似资料:
    • 本文向大家介绍Python使用Anaconda制作虚拟环境,包括了Python使用Anaconda制作虚拟环境的使用技巧和注意事项,需要的朋友参考一下 示例 virtualenvAnaconda的强大替代品-跨平台的pip类软件包管理器,捆绑了可快速创建和删除虚拟环境的功能。安装Anaconda之后,以下是一些入门指南: 创建环境 在<envname>您的虚拟环境中使用任意名称,并且<versio

    • python 的虚拟环境可以为一个 python 项目提供独立的解释环境、依赖包等资源,既能够很好的隔离不同项目使用不同 python 版本带来的冲突,而且还能方便项目的发布。 virtualenv virtualenv可用于创建独立的 Python 环境,它会创建一个包含项目所必须要的执行文件。 安装 virtualenv $ pip install virtualenv 配置 pip 安装第

    • 我一直在使用Spyder安装的Anaconda发行版,默认使用Python 2.7。目前我需要用Python 3.4设置一个开发虚拟环境。 在线调查后的两大建议是: 首先设置虚拟环境,并指向更改Spyder的首选项,例如这里; 在虚拟环境中安装所有Spyder依赖项,如PyQt4,例如这里; 这两项建议都很繁琐,看起来不像是明智的发展选择。 是否有一个解决方案,将允许运行Spyder所需的Pyth

    • 问题内容: 从代码移动到新机器(可能运行不同的OS)相对简单并且给出相同结果的意义上来说,主要的工作之一就是确保代码的可移植性。 来自Python背景,我习惯了虚拟环境的概念。与所需软件包的简单列表一起使用时,这可以确保安装的软件包和库在任何计算机上都可用,而不会引起太多麻烦。当然,这不能保证- 不同的操作系统都有自己的缺点和特点-但这可以为您提供95%的解决方案。 R中是否存在这样的东西?即使它

    • 我安装的虚拟环境使用()。这就出现了。

    • 问题内容: [PyPI]:pywin32 226已于 20191110 发行。 它 适用 于大多数 Python 安装程序( 例如, 适用于从Python下载的正式版本),但 不适 用于虚拟环境( 例如 ,使用 VirtualEnv ( v16.7.7 )和(基于进一步的研究) Python 的 venv创建 )。 我将 Python v3.8 .0和 v3.7 .3用作实验大鼠。这是前者的输出: