importare pyspark nella shell di python


111

Questa è una copia della domanda di qualcun altro su un altro forum a cui non è mai stata data risposta, quindi ho pensato di chiederla nuovamente qui, poiché ho lo stesso problema. (Vedi http://geekple.com/blogs/feeds/Xgzu7/posts/351703064084736 )

Ho Spark installato correttamente sulla mia macchina e sono in grado di eseguire programmi python con i moduli pyspark senza errori quando utilizzo ./bin/pyspark come interprete Python.

Tuttavia, quando provo a eseguire la normale shell Python, quando provo a importare i moduli pyspark ottengo questo errore:

from pyspark import SparkContext

e dice

"No module named pyspark".

Come posso risolvere questo problema? C'è una variabile d'ambiente che devo impostare per puntare Python alle intestazioni / librerie / ecc. Di pyspark? Se la mia installazione Spark è / spark /, quali percorsi pyspark devo includere? Oppure i programmi pyspark possono essere eseguiti solo dall'interprete pyspark?


Dicono che la modifica delle variabili di ambiente "non è molto efficace, perché viene sovrascritta molto rapidamente da bin / spark-submit". Forse puoi imparare qualcosa da questo scambio
emmagras

Risposte:


97

Ecco un metodo semplice (se non ti preoccupi di come funziona !!!)

Usa findspark

  1. Vai alla tua shell di python

    pip install findspark
    
    import findspark
    findspark.init()
  2. importare i moduli necessari

    from pyspark import SparkContext
    from pyspark import SparkConf
  3. Fatto!!!


Le altre soluzioni non hanno funzionato per me. Sto usando findspark per ora nel mio programma. Sembra una soluzione decente al problema.
Monaco analitico

Preferisco non aver bisogno di farlo .. ma hey .. dato che nient'altro funziona .. Lo prendo.
javadba

51

Se stampa tale errore:

ImportError: nessun modulo denominato py4j.java_gateway

Aggiungi $ SPARK_HOME / python / build a 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
Come descritto in un'altra risposta stackoverflow.com/questions/26533169/… ho dovuto aggiungere la seguente esportazione PYTHONPATH = $ SPARK_HOME / python / lib / py4j-0.8.2.1-src.zip: $ PYTHONPATH
meyerson

46

Si scopre che il cestino pyspark sta CARICANDO python e carica automaticamente i percorsi della libreria corretti. Dai un'occhiata a $ SPARK_HOME / bin / pyspark:

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

Ho aggiunto questa riga al mio file .bashrc e ora i moduli vengono trovati correttamente!


1
Oltre a questo passaggio, avevo anche bisogno di aggiungere export SPARK_HOME=~/dev/spark-1.1.0:, vai a capire. I nomi delle cartelle possono variare.
emmagras

21

non eseguire il tuo file py come: python filename.py usa invece:spark-submit filename.py


Qualcuno può spiegare perché non farlo? Ho esaminato questa domanda ma finora non sono stato in grado di trovare alcuna spiegazione del perché.
Zecca

@ Mint Le altre risposte mostrano perché; il pacchetto pyspark non è incluso in $ PYTHONPATH per impostazione predefinita, quindi un import pysparkfallirà alla riga di comando o in uno script eseguito. Devi sia un file. eseguire pyspark tramite spark-submit come previsto oppure b. aggiungi $ SPARK_HOME / python a $ PYTHONPATH.
kingledion

Un altro punto è che spark-submit è uno script di shell, che ti aiuta a configurare correttamente l'ambiente di sistema prima di usare spark, se fai semplicemente python main.py devi configurare correttamente l'ambiente di sistema, ad esempio PYTHONPATH, SPARK_HOME
E.ZY.

21

Esportando il percorso SPARK e il percorso Py4j, ha iniziato a funzionare:

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

Quindi, se non vuoi digitarli ogni volta che vuoi avviare la shell Python, potresti aggiungerla al tuo .bashrcfile


1
Non riesco a trovare la directory libexec nella mia Apache Sparkinstallazione, idea?
Alberto Bonsanto

@AlbertoBonsanto Scusa. Non ho affrontato questo problema. Quindi, nessuna idea :(
Dawny33

1
Sì, hanno tolto la cartella libexec in spark 1.5.2
bluerubez

1
@bluerubez Sembra essere presente in Spark 1.6.2 ... Inoltre, non sono sicuro a cosa serva la libexec/python/builddirectory, ma Spark 1.6.2 non ce l'ha
OneCricketeer

17

Su Mac, utilizzo Homebrew per installare Spark (formula "apache-spark"). Quindi, ho impostato PYTHONPATH in questo modo in modo che l'importazione di Python funzioni:

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

Sostituisci "1.2.0" con la versione attuale di apache-spark sul tuo Mac.


14

Per un'esecuzione Spark in pyspark sono necessari due componenti per lavorare insieme:

  • pyspark pacchetto python
  • Istanza Spark in una JVM

Quando si lanciano cose con spark-submit o pyspark, questi script si prenderanno cura di entrambi, cioè impostano il tuo PYTHONPATH, PATH, ecc. In modo che il tuo script possa trovare pyspark, e avviano anche l'istanza spark, configurando in base ai tuoi parametri , ad es. --master X

In alternativa, è possibile aggirare questi script ed eseguire la tua applicazione spark direttamente nell'interprete Python come python myscript.py. Ciò è particolarmente interessante quando gli script Spark iniziano a diventare più complessi e alla fine ricevono i propri argomenti.

  1. Assicurati che il pacchetto pyspark possa essere trovato dall'interprete Python. Come già discusso, aggiungi la directory spark / python a PYTHONPATH o installa direttamente pyspark usando pip install.
  2. Imposta i parametri dell'istanza spark dal tuo script (quelli che venivano passati a pyspark).
    • Per le configurazioni Spark come normalmente impostato con --conf, sono definite con un oggetto config (o string configs) in SparkSession.builder.config
    • Per le opzioni principali (come --master, o --driver-mem) per il momento puoi impostarle scrivendo nella variabile d'ambiente PYSPARK_SUBMIT_ARGS. Per rendere le cose più pulite e sicure puoi impostarlo dall'interno di Python stesso e Spark lo leggerà all'avvio.
  3. Avvia l'istanza, che richiede solo di chiamare getOrCreate()dall'oggetto builder.

Il tuo script può quindi avere qualcosa del genere:

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

Per sbarazzarsi di ImportError: No module named py4j.java_gateway, è necessario aggiungere le seguenti righe:

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

Su Windows 10 il seguente ha funzionato per me. Ho aggiunto le seguenti variabili di ambiente utilizzando Impostazioni > Modifica variabili di ambiente per il tuo account :

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

(cambia "C: \ Programming \ ..." nella cartella in cui hai installato spark)


5

Per gli utenti Linux, quanto segue è il modo corretto (e non hardcoded) di includere pyspark libaray in PYTHONPATH. Sono necessarie entrambe le parti PATH:

  1. Il percorso del modulo Python pyspark stesso e
  2. Il percorso della libreria zippata su cui si basa il modulo pyspark quando viene importato

Notare di seguito che la versione della libreria zippata è determinata dinamicamente, quindi non la codifichiamo.

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

4

Sto eseguendo un cluster Spark, su CentOS VM, che viene installato dai pacchetti cloudera yum.

Ho dovuto impostare le seguenti variabili per eseguire 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'

Questo è quello che ho fatto per utilizzare la mia distribuzione Anaconda con Spark. Questa è la versione Spark indipendente. Puoi cambiare la prima riga nel cestino Python dei tuoi utenti. Inoltre, a partire da Spark 2.2.0 PySpark è disponibile come pacchetto stand-alone su PyPi ma devo ancora provarlo.


4

Puoi ottenere il pyspark pathin python usando pip(se hai installato pyspark usando PIP) come sotto

pip show pyspark

3

Ho avuto lo stesso problema.

Assicurati inoltre di utilizzare la versione corretta di Python e di installarla con la versione di pip corretta. nel mio caso: avevo sia python 2.7 che 3.x. Ho installato pyspark con

pip2.7 installa pyspark

e ha funzionato.


2

Ho ricevuto questo errore perché lo script python che stavo cercando di inviare si chiamava pyspark.py ( facepalm ). La correzione era di impostare il mio PYTHONPATH come consigliato sopra, quindi rinominare lo script in pyspark_test.py e ripulire il pyspark.pyc che è stato creato in base al nome originale del mio script e che ha cancellato questo errore.


2

Nel caso di DSE (DataStax Cassandra & Spark) La seguente posizione deve essere aggiunta a PYTHONPATH

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

Quindi utilizzare dse pyspark per ottenere i moduli in path.

dse pyspark

2

Ho avuto lo stesso problema e aggiungerei una cosa alle soluzioni proposte sopra. Quando utilizzi Homebrew su Mac OS X per installare Spark, dovrai correggere l'indirizzo del percorso py4j per includere libexec nel percorso (ricordando di cambiare la versione di py4j con quella che hai);

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

Nota: ho provato a decomprimerlo e utilizzare py4jsolo la cartella, non ha funzionato. Usa il file zip ...
El Dude

2

Nel mio caso veniva installato in un diverso dist_package python (python 3.5) mentre stavo usando python 3.6, quindi quanto segue ha aiutato:

python -m pip install pyspark

1

Puoi anche creare un contenitore Docker con Alpine come sistema operativo e installare Python e Pyspark come pacchetti. Questo avrà tutto containerizzato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.