Pyspark wird im Client-Modus gestartet. bin/pyspark --master yarn-client --num-executors 60
Die Importnummer der Shell funktioniert einwandfrei, sie schlägt jedoch in den kmeans fehl. Irgendwie haben die Executoren kein numpy installiert, ist mein Gefühl. Ich habe nirgendwo eine gute Lösung gefunden, um Arbeiter über numpy zu informieren. Ich habe versucht, PYSPARK_PYTHON einzustellen, aber das hat auch nicht funktioniert.
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")
Stapelverfolgung
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
Um Spark im Yarn-Client-Modus verwenden zu können, müssen Sie Abhängigkeiten auf den Computern installieren, auf denen Yarn die Executors startet. Das ist der einzige todsichere Weg, um dies zu erreichen.
Die Verwendung von Spark mit Yarn-Cluster-Modus ist eine andere Geschichte. Sie können Python-Abhängigkeiten mit Spark-Submit verteilen.
spark-submit --master yarn-cluster my_script.py --py-files my_dependency.Zip
Die Situation bei numpy wird jedoch durch dasselbe verkompliziert, das es so schnell macht: Die Tatsache, dass das schwere Anheben in C erfolgt. Aufgrund der Art, wie es installiert wird, können Sie numpy auf diese Weise nicht verteilen.
Sudo pip install numpy
es scheint, als ob "numpy" mit "Sudo" neu installiert wurde und dieses Modul gefunden werden konnte.
numpy ist auf den (virtuellen) Arbeitsmaschinen nicht installiert. Wenn Sie Anaconda verwenden, ist es sehr praktisch, solche Python-Abhängigkeiten hochzuladen, wenn Sie die Anwendung im Cluster-Modus bereitstellen. (Sie müssen also keine numpy oder andere Module auf jeder Maschine installieren, stattdessen müssen Sie diese in Ihrer Anaconda installieren.) . Erstens: Zip Ihrer Anaconda und die Zip-Datei in den Cluster einfügen Skript.
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 kopiert anaconda.Zip aus dem hdfs-Pfad zu jedem Worker und verwendet pthon-env/anaconda/bin/python, um Aufgaben auszuführen.
Siehe PySpark mit Virtualenv ausführen kann weitere Informationen enthalten.
Ich hatte das gleiche Problem. Versuchen Sie, numpy auf pip3 zu installieren, wenn Sie Python3 verwenden
pip3 install numpy
Sie müssen sich dessen bewusst sein, dass Sie numpy auf jedem einzelnen Arbeiter und sogar auf dem Master selbst installiert haben müssen (abhängig von der Platzierung Ihrer Komponente).
Stellen Sie außerdem sicher, dass Sie den Befehl pip install numpy
von einem Root-Konto aus starten (Sudo reicht nicht aus), nachdem Sie umask auf 022 (umask 022
) gesetzt haben, damit die Rechte für den Spark- (oder Zeppelin-) Benutzer kaskadieren
Ich hatte ein ähnliches Problem, aber ich denke nicht, dass Sie PYSPARK_PYTHON setzen müssen, stattdessen einfach nur Numpy auf dem Worker-Computer (apt-get oder yum) zu installieren. Der Fehler zeigt Ihnen auch an, auf welcher Maschine der Import fehlte.
Was es für mich (auf mac
) gelöst hat, war eigentlich diese Anleitung (die auch erklärt, wie man python durch Jupyter Notebooks
- https://medium.com/@yajieli/installing-spark-pyspark-on-mac-and-fix-of-om-common-errors-355a9050f735
Auf den Punkt gebracht: (Vorausgesetzt, Sie haben spark with brew install spark
)
SPARK_PATH
Mit - brew info Apache-spark
~/.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]'
######
Jupyter Notebook
Einfach durch Aufrufen von: pyspark
zu öffnen.Und denken Sie daran, Sie müssen nicht Spark Context
Einstellen, sondern rufen einfach auf:
sc = SparkContext.getOrCreate()