Pyspark --py-files ne fonctionne pas
- Je utiliser ce document suggère http://spark.apache.org/docs/1.1.1/submitting-applications.html
spsark version 1.1.0
./spark/bin/spark-submit --py-files /home/hadoop/loganalysis/parser-src.zip \
/home/hadoop/loganalysis/ship-test.py
et conf dans le code :
conf = (SparkConf()
.setMaster("yarn-client")
.setAppName("LogAnalysis")
.set("spark.executor.memory", "1g")
.set("spark.executor.cores", "4")
.set("spark.executor.num", "2")
.set("spark.driver.memory", "4g")
.set("spark.kryoserializer.buffer.mb", "128"))
et nœud esclave se plaindre ImportError
14/12/25 05:09:53 WARN scheduler.TaskSetManager: Lost task 0.0 in stage 0.0 (TID 0, ip-172-31-10-8.cn-north-1.compute.internal): org.apache.spark.api.python.PythonException: Traceback (most recent call last):
File "/home/hadoop/spark/python/pyspark/worker.py", line 75, in main
command = pickleSer._read_with_length(infile)
File "/home/hadoop/spark/python/pyspark/serializers.py", line 150, in _read_with_length
return self.loads(obj)
ImportError: No module named parser
et parser-src.zip est testé localement.
[hadoop@ip-172-31-10-231 ~]$ python
Python 2.7.8 (default, Nov 3 2014, 10:17:30)
[GCC 4.8.2 20140120 (Red Hat 4.8.2-16)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path.insert(1, '/home/hadoop/loganalysis/parser-src.zip')
>>> from parser import parser
>>> parser.parse
<function parse at 0x7fa5ef4c9848>
>>>
Je vais essayer d'obtenir des infos concernant le travailleur à distance. voir s'il a copié les fichiers.ce que le sys.chemin ressemble à..et c'est difficile.
Mise à JOUR:
J'utilise cette étude a conclu que le fichier zip a été shiped. et sys.chemin d'accès a été défini. toujours à l'importation d'erreur.
data = list(range(4))
disdata = sc.parallelize(data)
result = disdata.map(lambda x: "sys.path: {0}\nDIR: {1} \n FILES: {2} \n parser: {3}".format(sys.path, os.getcwd(), os.listdir('.'), str(parser)))
result.collect()
print(result.take(4))
il semble que je dois creuser dans cloudpickle.ce qui signifie que j'ai besoin de comprendre comment cloudpickle œuvres et d'échec de la première.
: An error occurred while calling o40.collect.
: org.apache.spark.SparkException: Job aborted due to stage failure: Task 4 in stage 0.0 failed 4 times, most recent failure: Lost task 4.3 in stage 0.0 (TID 23, ip-172-31-10-8.cn-north-1.compute.internal): org.apache.spark.api.python.PythonException: Traceback (most recent call last):
File "/home/hadoop/spark/python/pyspark/worker.py", line 75, in main
command = pickleSer._read_with_length(infile)
File "/home/hadoop/spark/python/pyspark/serializers.py", line 150, in _read_with_length
return self.loads(obj)
File "/home/hadoop/spark/python/pyspark/cloudpickle.py", line 811, in subimport
__import__(name)
ImportError: ('No module named parser', <function subimport at 0x7f219ffad7d0>, ('parser.parser',))
Mise à JOUR:
quelqu'un rencontre le même problème dans l'étincelle de 0,8
http://apache-spark-user-list.1001560.n3.nabble.com/pyspark-Importing-other-py-files-in-PYTHONPATH-td2301.html
mais il a mis sa lib python dist-packages et à l'importation des œuvres. que j'ai essayé et toujours obtenir de l'erreur d'importation.
Mise à JOUR:
OH.gush.. je pense que le problème est causé par le fait de ne pas comprendre le fichier zip et python import comportement..je passe parser.py --py-files, il travaille, se plaignent d'une autre dépendance.
et zip seulement le .py fichiers[non compris .pyc] semble trop de travail.
Mais je ne comprenais pas pourquoi.
source d'informationauteur C19
Vous devez vous connecter pour publier un commentaire.
Essayez d'importer le module personnalisé à partir de l'intérieur de la méthode elle-même plutôt que sur le haut du script, par exemple:
plutôt que
Cloud Pickle ne semble pas reconnaître quand un module personnalisé a été importés, de sorte qu'il semble essayer de pickle haut-niveau des modules, ainsi que les autres données nécessaires à l'exécution de la méthode. Dans mon expérience, cela signifie que les modules semblent exister, mais ils n'ont pas utilisable membres, et imbriqués les modules ne peuvent pas être utilisés comme prévu. Une fois l'importation avec
from A import *
ou de l'intérieur de la méthode (import A.B
), les modules a fonctionné comme prévu.Essayer cette fonction de
SparkContext
Selon
pyspark
documentation iciEssayez de télécharger votre module python fichier à un stockage dans le cloud public (par exemple, AWS S3) et de transmettre l'URL de cette méthode.
Ici est plus complète de matériel de lecture: http://www.cloudera.com/documentation/enterprise/5-5-x/topics/spark_python.html
Cela ressemble à l'un ou plusieurs des noeuds ne sont pas configurés correctement. Faire tous les nœuds du cluster ont la même version/configuration de Python (c'est à dire qu'ils ont tous l'analyseur module installé)?
Si vous n'avez pas envie de vérifier un par un, vous pouvez écrire un script pour vérifier si il est installé/l'installer pour vous. Cette fil de discussion montre quelques façons de le faire.
Vous avez besoin pour emballer votre code Python en utilisant des outils comme setuptools. Cela vous permettra de créer un .oeuf de fichier qui est similaire à java jar fichier. Ensuite, vous pouvez spécifier le chemin d'accès de cet œuf fichier à l'aide de --py-fichiers
étincelle soumettre --py-fichiers path_to_egg_file path_to_spark_driver_file
J'ai été confronté à un problème de nature similaire, Mon nœuds de travail n'a pas pu détecter les modules, même si j'ai été en utilisant le
--py-files
commutateur.Il y avait quelques choses que j'ai fait - j'ai d'Abord essayé de mettre instruction d'importation après, j'ai créé SparkContext (sc) variable en espérant que l'importation doit avoir lieu après que le module a été expédié à tous les nœuds, mais encore il n'a pas de travail. J'ai ensuite essayé
sc.addFile
pour ajouter le module à l'intérieur du script lui-même (plutôt que de l'envoyer comme un argument de ligne de commande) et par la suite importé les fonctions du module. De ce fait, le truc, au moins dans mon cas.PySpark sur les EMR est configuré pour Python 2.6 par défaut, assurez-vous qu'ils ne sont pas installés pour le Python 2.7 interprète
Créer des fichiers zip (par exemple abc.zip) contenant tous vos dépendances.
Lors de la création de l'étincelle contexte mentionner le nom de fichier zip: