Lancer pyspark en mode client. bin/pyspark --master yarn-client --num-executors 60
Le numéro d'importation sur le shell va bien mais il échoue dans les kmeans. D'une certaine manière, les exécuteurs n'ont pas installé numpy, c'est mon sentiment. Je n'ai trouvé aucune bonne solution pour informer les travailleurs sur Numpy. J'ai essayé de définir PYSPARK_PYTHON mais cela n'a pas fonctionné non plus.
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")
Trace de la pile
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
Pour utiliser Spark en mode client Yarn, vous devez installer toutes les dépendances des ordinateurs sur lesquels Yarn lance les exécuteurs. C'est le seul moyen infaillible de faire ce travail.
L'utilisation du mode cluster Spark with Yarn est une autre histoire. Vous pouvez distribuer des dépendances python avec spark-submit.
spark-submit --master yarn-cluster my_script.py --py-files my_dependency.Zip
Cependant, la situation avec numpy est compliquée par la même chose qui le rend si rapide: le fait de soulever des objets lourds en C. En raison de la manière dont il est installé, vous ne pourrez pas distribuer numpy de cette manière.
Sudo pip install numpy
il semble ré-installer numpy avec "Sudo", et ce module pourrait être trouvé.
numpy n'est pas installé sur les ordinateurs de travail (virtuels). Si vous utilisez anaconda, il est très pratique de télécharger de telles dépendances Python lors du déploiement de l'application en mode cluster. (Il n’est donc pas nécessaire d’installer numpy ou d’autres modules sur chaque machine, mais ils doivent être insérés dans votre anaconda.) scénario.
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 copie anaconda.Zip du chemin d'accès hdfs à chaque travailleur et l'utilise avec pthon-env/anaconda/bin/python pour exécuter des tâches.
Reportez-vous à Exécution de PySpark avec Virtualenv peut fournir des informations supplémentaires.
J'ai eu le même problème. Essayez d’installer numpy sur pip3 si vous utilisez Python3.
pip3 install numpy
Vous devez être conscient du fait que numpy doit être installé sur chaque utilisateur, et même sur le maître lui-même (en fonction de l'emplacement de vos composants).
Assurez-vous également de lancer la commande pip install numpy
à partir d'un compte root (Sudo ne suffit pas) après avoir forcé umask à 022 (umask 022
) afin qu'il cascade les droits sur l'utilisateur Spark (ou Zeppelin).
J'avais un problème similaire mais je ne pense pas que vous deviez définir PYSPARK_PYTHON mais simplement installer numpy sur l'ordinateur de travail (apt-get ou yum). L'erreur vous indiquera également sur quelle machine l'importation était manquante.