spark-submitting 时没有名为 numpy 的模块

Posted

技术标签:

【中文标题】spark-submitting 时没有名为 numpy 的模块【英文标题】:No module named numpy when spark-submitting 【发布时间】:2015-04-04 17:18:10 【问题描述】:

我正在提交一个导入 numpy 的 python 文件,但我收到了 no module named numpy 错误。

$ spark-submit --py-files projects/other_requirements.egg projects/jobs/my_numpy_als.py
Traceback (most recent call last):
  File "/usr/local/www/my_numpy_als.py", line 13, in <module>
    from pyspark.mllib.recommendation import ALS
  File "/usr/lib/spark/python/pyspark/mllib/__init__.py", line 24, in <module>
    import numpy
ImportError: No module named numpy

我想我会为 numpy —python-files 提取一个鸡蛋,但我无法弄清楚如何构建那个鸡蛋。但后来我突然想到 pyspark 本身使用 numpy。引入我自己的 numpy 版本会很愚蠢。

您有什么想法可以在这里做适当的事情吗?

【问题讨论】:

【参考方案1】:

Spark 使用的 Python 版本似乎没有安装 numpy。这可能是因为您在虚拟环境中工作。

试试这个:

# The following is for specifying a Python version for PySpark. Here we
# use the currently calling Python version.
# This is handy for when we are using a virtualenv, for example, because
# otherwise Spark would choose the default system Python version.
os.environ['PYSPARK_PYTHON'] = sys.executable

【讨论】:

尝试为您当前使用的 Python 二进制文件安装完整的 SciPy 或独立的 NumPy 包:scipy.org/install.html【参考方案2】:

我通过在所有 emr 节点上安装 numpy 来实现此功能,方法是配置一个包含以下内容(除其他外)的小型引导脚本。

#!/bin/bash -xe sudo yum install python-numpy python-scipy -y

然后通过将以下选项添加到 aws emr 命令来配置要在启动集群时执行的引导脚本(以下示例为引导脚本提供了一个参数)

--bootstrap-actions Path=s3://some-bucket/keylocation/bootstrap.sh,Name=setup_dependencies,Args=[s3://some-bucket]

这也可以在从 DataPipeline 自动设置集群时使用。

【讨论】:

【参考方案3】:

有时,当您导入某些库时,您的命名空间会被numpy 函数污染。 minmaxsum 等函数特别容易受到这种污染。如有疑问,请定位对这些函数的调用并将这些调用替换为__builtin__.sum 等。这样做有时会比定位污染源更快。

【讨论】:

【参考方案4】:

确保您的 spark-env.shPYSPARK_PATH 指向正确的 Python 版本。将export PYSPARK_PATH=/your_python_exe_path 添加到/conf/spark-env.sh 文件中。

【讨论】:

以上是关于spark-submitting 时没有名为 numpy 的模块的主要内容,如果未能解决你的问题,请参考以下文章

执行 Pyspark 作业时顶点失败

从 pycharm 运行 spark-submit

使用spark-submit部署程序时的java.lang.NoSuchMethodError

Pyspark:spark-submit 不像 CLI 那样工作

Apache Spark - UDF 似乎不适用于 spark-submit

执行 spark-submit 时纱线/任何队列有啥用?