ImportError: No module named numpy on spark workers

ImportError: No module named numpy on spark workers

正在客户端模式下启动 pyspark。 bin/pyspark --master yarn-client --num-executors 60 shell 上的 import numpy 运行良好,但在 kmeans 中失败。不知何故,执行者没有安装 numpy 是我的感觉。我没有在任何地方找到任何好的解决方案来让工人了解 numpy。我尝试设置 PYSPARK_PYTHON 但这也没有用。

import numpy
features = numpy.load(open("combined_features.npz"))
features = features['arr_0']
features.shape
features_rdd = sc.parallelize(features, 5000)
from pyspark.mllib.clustering import KMeans, KMeansModel

from numpy import array
from math import sqrt
clusters = KMeans.train(features_rdd, 2, maxIterations=10, runs=10, initializationMode="random")

堆栈跟踪

 org.apache.spark.api.python.PythonException: Traceback (most recent call last):
  File "/hadoop/3/scratch/local/usercache/ajkale/appcache/application_1451301880705_525011/container_1451301880705_525011_01_000011/pyspark.zip/pyspark/worker.py", line 98, in main
    command = pickleSer._read_with_length(infile)
  File "/hadoop/3/scratch/local/usercache/ajkale/appcache/application_1451301880705_525011/container_1451301880705_525011_01_000011/pyspark.zip/pyspark/serializers.py", line 164, in _read_with_length
    return self.loads(obj)
  File "/hadoop/3/scratch/local/usercache/ajkale/appcache/application_1451301880705_525011/container_1451301880705_525011_01_000011/pyspark.zip/pyspark/serializers.py", line 422, in loads
    return pickle.loads(obj)
  File "/hadoop/3/scratch/local/usercache/ajkale/appcache/application_1451301880705_525011/container_1451301880705_525011_01_000011/pyspark.zip/pyspark/mllib/__init__.py", line 25, in <module>

ImportError: No module named numpy

        at org.apache.spark.api.python.PythonRunner$$anon.read(PythonRDD.scala:166)
        at org.apache.spark.api.python.PythonRunner$$anon.<init>(PythonRDD.scala:207)
        at org.apache.spark.api.python.PythonRunner.compute(PythonRDD.scala:125)
        at org.apache.spark.api.python.PythonRDD.compute(PythonRDD.scala:70)
        at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:297)
        at org.apache.spark.rdd.RDD.iterator(RDD.scala:264)
        at org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:38)
        at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:297)
        at org.apache.spark.CacheManager.getOrCompute(CacheManager.scala:69)
        at org.apache.spark.rdd.RDD.iterator(RDD.scala:262)
        at org.apache.spark.rdd.ZippedPartitionsRDD2.compute(ZippedPartitionsRDD.scala:99)
        at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:297)
        at org.apache.spark.rdd.RDD.iterator(RDD.scala:264)
        at org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:38)
        at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:297)
        at org.apache.spark.rdd.RDD.iterator(RDD.scala:264)
        at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:66)
        at org.apache.spark.scheduler.Task.run(Task.scala:88)
        at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:214)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at java.lang.Thread.run(Thread.java:745)
        enter code here

要在 Yarn 客户端模式下使用 Spark,您需要在 Yarn 启动执行程序的机器上安装任何依赖项。这是完成这项工作的唯一可靠方法。

在 Yarn 集群模式下使用 Spark 是另一回事。您可以使用 spark-submit 分发 python 依赖项。

spark-submit --master yarn-cluster my_script.py --py-files my_dependency.zip

但是,numpy 的情况由于使它如此之快的同一件事而变得复杂:事实上,它在 C 中完成了繁重的工作。由于它的安装方式,您将无法分发numpy 这种方式。

我遇到了类似的问题,但我认为您不需要设置 PYSPARK_PYTHON,而只需在工作计算机(apt-get 或 yum)上安装 numpy。该错误还会告诉您在哪台机器上缺少导入。

numpy 未安装在工作(虚拟)机器上。如果你使用anaconda,在集群模式下部署应用时上传这样的python个依赖是非常方便的。 (所以不需要在每台机器上安装 numpy 或其他模块,它们必须在你的 anaconda 中)。 首先,压缩你的 anaconda 并将 zip 文件放入集群,然后你可以使用以下脚本提交作业。

 spark-submit \
 --master yarn \
 --deploy-mode cluster \
 --archives hdfs://host/path/to/anaconda.zip#python-env
 --conf spark.yarn.appMasterEnv.PYSPARK_PYTHON=pthon-env/anaconda/bin/python 
 app_main.py

Yarn 将从 hdfs 路径复制 anaconda.zip 到每个 worker,并使用那个 pthon-env/anaconda/bin/python 来执行任务。

参考 Running PySpark with Virtualenv 可能会提供更多信息。

我遇到了同样的问题。如果您使用 Python3

,请尝试在 pip3 上安装 numpy

pip3 install numpy

你必须知道你需要在每个 worker 上安装 numpy,甚至 master 本身(取决于你的组件放置)

还要确保在将 umask 强制为 022 (umask 022) 后从 root 帐户启动 pip install numpy 命令(sudo 不够),以便将权限级联到 Spark(或 Zeppelin)User

为我解决了这个问题(在 mac 上)实际上是这个指南(它还解释了如何 运行 python 通过 Jupyter Notebooks - https://medium.com/@yajieli/installing-spark-pyspark-on-mac-and-fix-of-some-common-errors-355a9050f735

简而言之: (假设您使用 brew install spark 安装了 spark)

  1. 使用 - brew info apache-spark
  2. 找到 SPARK_PATH
  3. 将这些行添加到您的 ~/.bash_profile
# Spark and Python
######
export SPARK_PATH=/usr/local/Cellar/apache-spark/2.4.1
export PYSPARK_DRIVER_PYTHON="jupyter"
export PYSPARK_DRIVER_PYTHON_OPTS="notebook"
#For python 3, You have to add the line below or you will get an error
export PYSPARK_PYTHON=python3
alias snotebook='$SPARK_PATH/bin/pyspark --master local[2]'
######
  1. 您只需调用以下命令即可打开 Jupyter Notebookpyspark

请记住,您不需要设置 Spark Context,只需调用:

sc = SparkContext.getOrCreate()

我的环境变量 PYSPARK_PYTHON 没有设置,所以我设置了 /etc/environment 文件并添加了 python 环境路径到变量。

PYSPARK_PYTHON=/home/venv/python3

之后就没有这个错误了

需要检查的几件事

  • 在具有 sudo 权限的工作节点上安装所需的包,以便所有用户都可以使用它们
  • 如果您在工作节点上有多个版本的 python,请确保为 Spark 使用的 python 安装软件包(通常由 PYSPARK_PYTHON 设置)。
  • 最后,要传递自定义模块(.py 文件),请在使用 spark-submit 或 pyspark
  • 启动会话时使用 --py-files