ImportError: нет модуля с именем numpy для искровых работников

Запуск pyspark в режиме клиента. bin/pyspark --master yarn-client --num-executors 60 Импульс импорта в оболочке идет нормально, но он не работает в 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

Ответ 1

Чтобы использовать режим Spark in Yarn, вам нужно установить какие-либо зависимости к машинам, на которых начинается пряжа исполнителей. Это единственный верный способ сделать эту работу.

Использование режима Spark with Yarn cluster - это совсем другая история. Вы можете распространять зависимости python с помощью spark-submit.

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

Однако ситуация с numpy осложняется тем же, что делает ее так быстро: тот факт, что делает тяжелый подъем в C. Из-за того, что он установлен, вы не сможете распространять numpy в этот способ.

Ответ 3

numpy не устанавливается на рабочие (виртуальные) машины. Если вы используете anaconda, очень удобно загружать такие зависимости python при развертывании приложения в режиме кластера. (Таким образом, нет необходимости устанавливать numpy или другие модули на каждой машине, вместо этого они должны быть в вашей анаконде). Сначала заархивируйте вашу анаконду и поместите 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 скопирует файл anaconda.zip из пути hdfs каждому работнику и использует этот pthon-env/anaconda/bin/python для выполнения задач.

Обратитесь к разделу Запуск PySpark с Virtualenv, чтобы получить больше информации.

Ответ 4

У меня была аналогичная проблема, но я не думаю, что вам нужно установить PYSPARK_PYTHON вместо этого, просто установите numpy на рабочем компьютере (apt-get или yum). Ошибка также сообщит вам, на каком аппарате отсутствовал импорт.

Ответ 5

sudo pip install numpy

Кажется, переустановка numpy с "sudo", и этот модуль можно найти.

Ответ 6

Я была такая же проблема. Попробуйте установить numpy на pip3, если вы используете Python3

pip3 install numpy

Ответ 7

Это так же просто, как и ошибка: "ImportError: нет модуля с именем numpy".

установить pip и затем numpy:

  1. CD в каталог pyspark. Вы найдете путь, по которому выдается ошибка. Путь, показанный ниже, предназначен для моей песочницы

    /usr/hdp/current/spark-client/python/lib/pyspark
    
  2. Установить пункт

    yum install python-pip
    
  3. установить NumPy

    pip install numpy
    
  4. обновить пункт (этот шаг может не понадобиться).

    pip install --upgrade pip
    

Ответ 8

Вы должны знать, что на каждом работнике должен быть установлен numpy и даже сам мастер (в зависимости от размещения вашего компонента)

Также убедитесь, что команда pip install numpy запущена из учетной записи root (sudo не достаточно) после установки umask на 022 (umask 022), чтобы она каскадно передавала права пользователю Spark (или Zeppelin).

Ответ 9

Что для меня решило (на mac), так это собственно это руководство (которое также объясняет, как запускать python через Jupyter Notebooks - https://medium.com/@yajieli/install-spark-pyspark-on-mac-and-fix- из-некоторых распространенных ошибок-355a9050f735-

В двух словах: (при условии, что вы установили спарк с brew install spark)

  1. Найдите SPARK_PATH используя - brew info apache-spark
  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: pyspark

И просто помните, что вам не нужно устанавливать Spark Context а просто вызвать:

sc = SparkContext.getOrCreate()