1

Je lance pyspark sur un cluster Amazon EMR. J'ai un script de test très simple pour voir si je peux écrire des données à l'aide s3-soumettre étincelle ...pyspark saveAsTextFile fonctionne pour python 2.7 mais pas 3.4

from pyspark import SparkContext 
sc = SparkContext() 
numbers = sc.parallelize(range(100)) 
numbers.saveAsTextFile("s3n://my-bucket/test.txt") 
sc.stop() 

Quand je lance ce script en utilisant soumettre étincelle dans un environnement de python2.7, cela fonctionne très bien . Mais quand je tente d'exécuter le même script dans un environnement python3.4, je reçois le retraçage suivant ...

Caused by: org.apache.spark.api.python.PythonException: Traceback (most recent call last): 
File ".../pyspark/worker.py", line 161, in main 
    func, profiler, deserializer, serializer = read_command(pickleSer, infile) 
File ".../pyspark/worker.py", line 54, in read_command 
    command = serializer._read_with_length(file) 
File ".../pyspark/serializers.py", line 164, in _read_with_length 
    return self.loads(obj) 
File ".../pyspark/serializers.py", line 419, in loads 
    return pickle.loads(obj, encoding=encoding) 
AttributeError: Can't get attribute 'unicode' on <module 'builtins' (built-in)> 

Je manipuler mon environnement python utilisant Conda et en définissant les variables PYSPARK_PYTHON et PYSPARK_DRIVER_PYTHON.

Y at-il un problème lors de l'utilisation de saveAsTextFile dans python 3? Ou est-ce que je manque une étape dans la configuration de mon environnement python 3?

Merci!

Répondre

0

Ok, donc il semble que cela n'a rien à voir avec python3, et tout à voir avec mon environnement de Conda. En bref, j'ai mis en place un environnement conda dans mon bootstrap.sh, mais je l'ai seulement activé sur le nœud maître. Ainsi, le nœud maître utilisait conda python, mais les travailleurs utilisaient le système python.

Ma solution est maintenant de définir PYSPARK_PYTHON=/home/hadoop/miniconda3/envs/myenv/python.

Existe-t-il un meilleur moyen d'activer mon environnement de conda sur les nœuds de travail?

0

Il est possible que votre cluster DME est configuré pour utiliser pyspark 2.7, alors que vous exécutez python 3.4 ce qui pourrait provoquer un problème lors de l'utilisation avec pyspark 2.7

Le lien suivant décrit comment configurer Amazon DME pour utiliser étincelle avec python 3,4

Je sais que Python est installé sur 3.4.3 une instances de cluster Amazon EMR, mais la version Python par défaut utilisé par Spark et d'autres programmes est Python 2.7.10. Comment changer la version Python par défaut en Python 3 et exécuter un travail pyspark?

https://aws.amazon.com/premiumsupport/knowledge-center/emr-pyspark-python-3x/


Il est l'autre implémentation de la fonction range() dans python2 vs python3. Dans Python2, range() renvoie a list of numbers.
En Python2 range() renvoie a generator.

Ainsi, lorsque vous utilisez python3, l'entrée que vous fournissez est un generator au lieu de list of numbers

En savoir plus sur la différence entre range() dans python2 vs python3:

python2 https://docs.python.org/2/library/functions.html#range gamme (début, arrêt [, pas])

Ceci est une fonction polyvalente pour créer des listes contenant des progressions arithmétiques . Il est le plus souvent utilisé dans les boucles. Les arguments doivent être être des entiers simples. Si l'argument step est omis, il vaut par défaut 1. Si l'argument start est omis, il est par défaut à 0. Le formulaire complet renvoie une liste d'entiers simples [start, start + step, start + 2 * étape,. ..].Si le pas est positif, le dernier élément est le plus grand départ + i * pas inférieur à l'arrêt; Si l'étape est négative, le dernier élément est le plus petit début + i * pas supérieur à l'arrêt. l'étape ne doit pas être zéro (sinon ValueError est déclenché).

Exemple:

>>> range(10) 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 

python 3 https://docs.python.org/3/library/functions.html#func-range plage (démarrage, arrêt [étape])

Plutôt que d'être une fonction, la gamme est en fait un type de séquence immutable , comme documenté dans Ranges and Sequence Types - list, tup le, range.

>>> range(10) 
range(0, 10) 
+0

Merci pour votre réponse! J'ai remplacé 'range (100)' par '['a', 'b', 'c', 'd']' et j'ai ajouté un 'configuration.json' qui définit' "PYSPARK_PYTHON": "/ usr/bin/python3 "'. Malheureusement, je reçois toujours la même erreur. –

0

Essayez cette

export PYSPARK_PYTHON = python3