【问题标题】:ImportError: No module named numpy on spark workersImportError:火花工作人员上没有名为 numpy 的模块
【发布时间】:2016-02-05 00:22:09
【问题描述】:

在客户端模式下启动 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$1.read(PythonRDD.scala:166)
        at org.apache.spark.api.python.PythonRunner$$anon$1.<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

【问题讨论】:

  • 你能访问工人正在运行的机器并检查你的PYSPARK_PYTHON是否确实有numpy?
  • 另外,作为预防措施,请确保 py 文件本身未命名为“numpy”。
  • @Snoozer 不幸的是,我无法访问此纱线设置中的工作人员。
  • @abe 没有 py 文件。我把这些倒在火花壳上。
  • 你有任何理由相信 NumPy 安装在工作节点上吗?如果不修补路径将无济于事。虽然 PySpark 提供了分发依赖项的机制,但它不太可能帮助您处理像 NumPy 这样的复杂包(请参阅stackoverflow.com/a/34385088/1560062)。

标签: python numpy apache-spark pyspark


【解决方案1】:

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

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

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

然而,使用 numpy 的情况也很复杂,因为它的速度如此之快:在 C 语言中完成繁重的工作。由于它的安装方式,您将无法将 numpy 分发到这种时尚。

【讨论】:

  • 所以如果理解正确的话,numpy必须安装在每个executor上,不能分发?
  • 不幸的是,是的。我和我的团队都被这个确切的问题所困扰。
  • 谢谢@dayman,这有帮助!我开始在 scala 中实现它。不过,我希望这个 pyspark 问题有更好的解决方案。
  • 能不能把所有的依赖打包成一个virtualenv,压缩并转储到集群的每个节点上?虽然我知道这可能会变得非常沉重,但这会起作用吗?
【解决方案2】:

为我解决的问题(在 mac 上)实际上是本指南(其中还解释了如何通过 Jupyter Notebooks 运行 python - 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 查找 SPARK_PATH
  2. 将这些行添加到您的~/.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 Notebook,只需调用: pyspark

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

sc = SparkContext.getOrCreate()

【讨论】:

  • 我相信你是在本地运行 spark,像这样的独立应用程序,而不是在集群上。
【解决方案3】:

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

PYSPARK_PYTHON=/home/venv/python3

之后,就没有这个错误了。

【讨论】:

    【解决方案4】:

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

     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 会将 anaconda.zip 从 hdfs 路径复制到每个 worker,并使用该 pthon-env/anaconda/bin/python 执行任务。

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

    【讨论】:

      【解决方案5】:

      我有同样的问题。如果您使用的是 Python3,请尝试在 pip3 上安装 numpy

      pip3 install numpy

      【讨论】:

      • 首先确保 pyspark 有效地使用 Python3
      【解决方案6】:

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

      【讨论】:

        【解决方案7】:

        您必须知道,您需要在每个工作人员上安装 numpy,甚至是主服务器本身(取决于您的组件位置)

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

        【讨论】:

          【解决方案8】:

          需要检查的一些事项

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-02-12
            • 1970-01-01
            • 2013-03-11
            • 1970-01-01
            • 2012-12-07
            • 1970-01-01
            相关资源
            最近更新 更多