importation de pyspark dans le shell python


111

Ceci est une copie de la question de quelqu'un d'autre sur un autre forum qui n'a jamais reçu de réponse, alors j'ai pensé que je la poserais à nouveau ici, car j'ai le même problème. (Voir http://geekple.com/blogs/feeds/Xgzu7/posts/351703064084736 )

J'ai installé Spark correctement sur ma machine et je suis capable d'exécuter des programmes python avec les modules pyspark sans erreur lorsque j'utilise ./bin/pyspark comme interprète python.

Cependant, lorsque j'essaie d'exécuter le shell Python normal, lorsque j'essaie d'importer des modules pyspark, j'obtiens cette erreur:

from pyspark import SparkContext

et ça dit

"No module named pyspark".

Comment puis-je réparer cela? Y a-t-il une variable d'environnement que je dois définir pour pointer Python vers les en-têtes / bibliothèques / etc pyspark.? Si mon installation Spark est / spark /, quels chemins pyspark dois-je inclure? Ou les programmes pyspark peuvent-ils être exécutés uniquement à partir de l'interpréteur pyspark?


Ils disent que changer les variables d'environnement n'est "pas très efficace, car il est remplacé très rapidement par bin / spark-submit". Peut-être que vous pouvez apprendre quelque chose de cet échange
emmagras

Réponses:


97

Voici une méthode simple (si vous ne vous souciez pas de son fonctionnement !!!)

Utiliser findpark

  1. Accédez à votre shell python

    pip install findspark
    
    import findspark
    findspark.init()
  2. importer les modules nécessaires

    from pyspark import SparkContext
    from pyspark import SparkConf
  3. Terminé!!!


Les autres solutions n'ont pas fonctionné pour moi. J'utilise pour l'instant findpark dans mon programme. Cela semble être une solution de contournement décente au problème.
Analytical Monk

Je préfère ne pas avoir besoin de faire ça… mais bon … étant donné que rien d'autre ne fonctionne … je vais le prendre.
javadba

51

S'il imprime une telle erreur:

ImportError: aucun module nommé py4j.java_gateway

Veuillez ajouter $ SPARK_HOME / python / build à PYTHONPATH:

export SPARK_HOME=/Users/pzhang/apps/spark-1.1.0-bin-hadoop2.4
export PYTHONPATH=$SPARK_HOME/python:$SPARK_HOME/python/build:$PYTHONPATH

9
Comme décrit dans une autre réponse stackoverflow.com/questions/26533169/ ... j'ai dû ajouter l'export suivant PYTHONPATH = $ SPARK_HOME / python / lib / py4j-0.8.2.1-src.zip: $ PYTHONPATH
meyerson

46

Il s'avère que le bin pyspark CHARGE python et charge automatiquement les chemins de bibliothèque corrects. Découvrez $ SPARK_HOME / bin / pyspark:

# Add the PySpark classes to the Python path:
export PYTHONPATH=$SPARK_HOME/python/:$PYTHONPATH

J'ai ajouté cette ligne à mon fichier .bashrc et les modules sont maintenant correctement trouvés!


1
En plus de cette étape, j'avais également besoin d'ajouter:, export SPARK_HOME=~/dev/spark-1.1.0allez comprendre. Vos noms de dossiers peuvent varier.
emmagras

21

N'exécutez pas votre fichier py en tant que: python filename.py utilisez plutôt:spark-submit filename.py


Quelqu'un peut-il expliquer pourquoi ne pas faire cela? J'ai étudié cette question, mais jusqu'à présent, je n'ai pas été en mesure d'en trouver qui explique pourquoi.
État neuf

@Menthe Les autres réponses montrent pourquoi; le package pyspark n'est pas inclus dans le $ PYTHONPATH par défaut, donc un import pysparkéchouera en ligne de commande ou dans un script exécuté. Vous devez soit a. exécutez pyspark via spark-submit comme prévu ou b. ajoutez $ SPARK_HOME / python à $ PYTHONPATH.
kingledion

Un autre point est spark-submit est un script shell, qui vous aide à configurer correctement l'environnement système avant d'utiliser spark, si vous ne faites que python main.py, vous devez configurer correctement l'environnement système, par exemple PYTHONPATH, SPARK_HOME
E.ZY.

21

En exportant le chemin SPARK et le chemin Py4j, cela a commencé à fonctionner:

export SPARK_HOME=/usr/local/Cellar/apache-spark/1.5.1
export PYTHONPATH=$SPARK_HOME/libexec/python:$SPARK_HOME/libexec/python/build:$PYTHONPATH
PYTHONPATH=$SPARK_HOME/python/lib/py4j-0.8.2.1-src.zip:$PYTHONPATH 
export PYTHONPATH=$SPARK_HOME/python:$SPARK_HOME/python/build:$PYTHONPATH

Donc, si vous ne voulez pas les taper à chaque fois que vous voulez lancer le shell Python, vous voudrez peut-être l'ajouter à votre .bashrcfichier


1
Je ne trouve pas le répertoire libexec dans mon Apache Sparkinstallation, une idée?
Alberto Bonsanto

@AlbertoBonsanto Désolé. Je n'ai pas rencontré ce problème. Donc, aucune idée :(
Dawny33

1
Ouais, ils ont sorti le dossier libexec dans spark 1.5.2
bluerubez

1
@bluerubez semble être là dans spark 1.6.2 ... Aussi, je ne sais pas à quoi libexec/python/buildsert le répertoire, mais spark 1.6.2 ne l'a pas
OneCricketeer

17

Sur Mac, j'utilise Homebrew pour installer Spark (formule "apache-spark"). Ensuite, j'ai défini le PYTHONPATH de cette façon pour que l'importation Python fonctionne:

export SPARK_HOME=/usr/local/Cellar/apache-spark/1.2.0
export PYTHONPATH=$SPARK_HOME/libexec/python:$SPARK_HOME/libexec/python/build:$PYTHONPATH

Remplacez le "1.2.0" par la version actuelle d'apache-spark sur votre mac.


14

Pour une exécution Spark dans pyspark, deux composants sont nécessaires pour fonctionner ensemble:

  • pyspark package python
  • Instance Spark dans une JVM

Lors du lancement de choses avec spark-submit ou pyspark, ces scripts prendront en charge les deux, c'est-à-dire qu'ils configurent votre PYTHONPATH, PATH, etc., afin que votre script puisse trouver pyspark, et ils démarrent également l'instance spark, en se configurant en fonction de vos paramètres , par exemple --master X

Alternativement, il est possible de contourner ces scripts et d'exécuter votre application Spark directement dans l'interpréteur python comme python myscript.py. Ceci est particulièrement intéressant lorsque les scripts Spark commencent à devenir plus complexes et reçoivent finalement leurs propres arguments.

  1. Assurez-vous que le package pyspark peut être trouvé par l'interpréteur Python. Comme déjà discuté, ajoutez le répertoire spark / python à PYTHONPATH ou installez directement pyspark à l'aide de pip install.
  2. Définissez les paramètres de l'instance Spark à partir de votre script (ceux qui étaient auparavant passés à pyspark).
    • Pour les configurations Spark comme vous le feriez normalement avec --conf, elles sont définies avec un objet de configuration (ou des configurations de chaîne) dans SparkSession.builder.config
    • Pour les options principales (comme --master ou --driver-mem) pour le moment, vous pouvez les définir en écrivant dans la variable d'environnement PYSPARK_SUBMIT_ARGS. Pour rendre les choses plus propres et plus sûres, vous pouvez le définir à partir de Python lui-même, et Spark le lira au démarrage.
  3. Démarrez l'instance, ce qui vous oblige simplement à appeler à getOrCreate()partir de l'objet générateur.

Votre script peut donc avoir quelque chose comme ceci:

from pyspark.sql import SparkSession

if __name__ == "__main__":
    if spark_main_opts:
        # Set main options, e.g. "--master local[4]"
        os.environ['PYSPARK_SUBMIT_ARGS'] = spark_main_opts + " pyspark-shell"

    # Set spark config
    spark = (SparkSession.builder
             .config("spark.checkpoint.compress", True)
             .config("spark.jars.packages", "graphframes:graphframes:0.5.0-spark2.1-s_2.11")
             .getOrCreate())

9

Pour vous en débarrasser ImportError: No module named py4j.java_gateway, vous devez ajouter les lignes suivantes:

import os
import sys


os.environ['SPARK_HOME'] = "D:\python\spark-1.4.1-bin-hadoop2.4"


sys.path.append("D:\python\spark-1.4.1-bin-hadoop2.4\python")
sys.path.append("D:\python\spark-1.4.1-bin-hadoop2.4\python\lib\py4j-0.8.2.1-src.zip")

try:
    from pyspark import SparkContext
    from pyspark import SparkConf

    print ("success")

except ImportError as e:
    print ("error importing spark modules", e)
    sys.exit(1)

7

Sur Windows 10, ce qui suit a fonctionné pour moi. J'ai ajouté les variables d'environnement suivantes en utilisant Paramètres > Modifier les variables d'environnement pour votre compte :

SPARK_HOME=C:\Programming\spark-2.0.1-bin-hadoop2.7
PYTHONPATH=%SPARK_HOME%\python;%PYTHONPATH%

(remplacez "C: \ Programming \ ..." par le dossier dans lequel vous avez installé spark)


5

Pour les utilisateurs Linux, ce qui suit est la manière correcte (et non codée en dur) d'inclure la libaray pyspark dans PYTHONPATH. Les deux parties PATH sont nécessaires:

  1. Le chemin d'accès au module pyspark Python lui-même, et
  2. Le chemin d'accès à la bibliothèque zippée sur laquelle s'appuie ce module pyspark lors de l'importation

Notez ci-dessous que la version de la bibliothèque zippée est déterminée dynamiquement, nous ne la codons donc pas en dur.

export PYTHONPATH=${SPARK_HOME}/python/:$(echo ${SPARK_HOME}/python/lib/py4j-*-src.zip):${PYTHONPATH}

4

J'exécute un cluster Spark, sur CentOS VM, qui est installé à partir des packages cloudera yum.

J'ai dû définir les variables suivantes pour exécuter pyspark.

export SPARK_HOME=/usr/lib/spark;
export PYTHONPATH=$SPARK_HOME/python:$SPARK_HOME/python/lib/py4j-0.9-src.zip:$PYTHONPATH

4
export PYSPARK_PYTHON=/home/user/anaconda3/bin/python
export PYSPARK_DRIVER_PYTHON=jupyter
export PYSPARK_DRIVER_PYTHON_OPTS='notebook'

C'est ce que j'ai fait pour utiliser ma distribution Anaconda avec Spark. Ceci est indépendant de la version de Spark. Vous pouvez remplacer la première ligne par le bin python de vos utilisateurs. De plus, à partir de Spark 2.2.0, PySpark est disponible en tant que package autonome sur PyPi, mais je ne l'ai pas encore testé.


4

Vous pouvez obtenir le pyspark pathen python en utilisant pip(si vous avez installé pyspark en utilisant PIP) comme ci-dessous

pip show pyspark

3

J'ai eu le même problème.

Assurez-vous également que vous utilisez la bonne version de python et que vous l'installez avec la bonne version de pip. dans mon cas: j'avais à la fois python 2.7 et 3.x. J'ai installé pyspark avec

pip2.7 installer pyspark

et cela a fonctionné.


2

J'ai eu cette erreur parce que le script python que j'essayais de soumettre s'appelait pyspark.py ( facepalm ). Le correctif consistait à définir mon PYTHONPATH comme recommandé ci-dessus, puis à renommer le script en pyspark_test.py et à nettoyer le pyspark.pyc qui a été créé en fonction du nom d'origine de mes scripts et qui a effacé cette erreur.


2

Dans le cas de DSE (DataStax Cassandra & Spark) L'emplacement suivant doit être ajouté à PYTHONPATH

export PYTHONPATH=/usr/share/dse/resources/spark/python:$PYTHONPATH

Ensuite, utilisez le pyspark dse pour obtenir les modules dans path.

dse pyspark

2

J'ai eu ce même problème et ajouterais une chose aux solutions proposées ci-dessus. Lorsque vous utilisez Homebrew sur Mac OS X pour installer Spark, vous devrez corriger l'adresse du chemin py4j pour inclure libexec dans le chemin (en vous rappelant de changer la version py4j par celle que vous avez);

PYTHONPATH=$SPARK_HOME/libexec/python/lib/py4j-0.9-src.zip:$PYTHONPATH

Remarque - J'ai essayé de le décompresser et d'utiliser py4juniquement le dossier, cela n'a pas fonctionné. Utilisez le fichier zip ...
El Dude

2

Dans mon cas, il était installé sur un autre python dist_package (python 3.5) alors que j'utilisais python 3.6, donc ce qui suit a aidé:

python -m pip install pyspark

1

Vous pouvez également créer un conteneur Docker avec Alpine comme système d'exploitation et installer Python et Pyspark en tant que packages. Cela aura tout conteneurisé.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.