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
函数污染。 min
、max
和sum
等函数特别容易受到这种污染。如有疑问,请定位对这些函数的调用并将这些调用替换为__builtin__.sum
等。这样做有时会比定位污染源更快。
【讨论】:
【参考方案4】:确保您的 spark-env.sh
有 PYSPARK_PATH
指向正确的 Python 版本。将export PYSPARK_PATH=/your_python_exe_path
添加到/conf/spark-env.sh
文件中。
【讨论】:
以上是关于spark-submitting 时没有名为 numpy 的模块的主要内容,如果未能解决你的问题,请参考以下文章
使用spark-submit部署程序时的java.lang.NoSuchMethodError
Pyspark:spark-submit 不像 CLI 那样工作