Come imposto la versione python del driver in Spark?


88

Sto usando spark 1.4.0-rc2 quindi posso usare python 3 con spark. Se aggiungo export PYSPARK_PYTHON=python3al mio file .bashrc, posso eseguire Spark in modo interattivo con Python 3. Tuttavia, se voglio eseguire un programma autonomo in modalità locale, ottengo un errore:

Exception: Python in worker has different version 3.4 than that in driver 2.7, PySpark cannot run with different minor versions

Come posso specificare la versione di python per il driver? L'impostazione export PYSPARK_DRIVER_PYTHON=python3non ha funzionato.

Risposte:


34

Devi assicurarti che il progetto standalone che stai lanciando sia avviato con Python 3. Se stai inviando il tuo programma standalone tramite spark-submit allora dovrebbe funzionare bene, ma se lo stai avviando con python assicurati di usare python3 per iniziare la tua app.

Inoltre, assicurati di aver impostato le tue variabili env in ./conf/spark-env.sh(se non esiste puoi usarlo spark-env.sh.templatecome base).


3
@ Kevin - Ho lo stesso problema, potresti per favore pubblicare la tua soluzione riguardo alla modifica che hai fatto in spark-evn.sh.
Dev Patel

1
Questo è il modo giusto per indurre le variabili PATH a Spark, invece di modificare .bashrc.
CᴴᴀZ

Perché usare python 3 richiede @Holden?
Jerzy

Spark può essere eseguito in python2, ma in questo caso l'utente stava cercando di specificare python3 nella domanda. Qualunque sia la versione di Python, deve essere eseguita in modo coerente.
Holden

83

L'impostazione PYSPARK_PYTHON=python3ed PYSPARK_DRIVER_PYTHON=python3entrambi su python3 funziona per me. L'ho fatto usando export nel mio .bashrc. Alla fine, queste sono le variabili che creo:

export SPARK_HOME="$HOME/Downloads/spark-1.4.0-bin-hadoop2.4"
export IPYTHON=1
export PYSPARK_PYTHON=/usr/bin/python3
export PYSPARK_DRIVER_PYTHON=ipython3
export PYSPARK_DRIVER_PYTHON_OPTS="notebook"

Ho anche seguito questo tutorial per farlo funzionare dall'interno del notebook Ipython3: http://ramhiser.com/2015/02/01/configuring-ipython-notebook-support-for-pyspark/


5
Si è verificato un errore su Spark 2.1 relativo all'opzione "IPYTHON = 1". Il messaggio di errore è "IPYTHON e IPYTHON_OPTS vengono rimossi in Spark 2.0+. Rimuovili dall'ambiente e imposta invece PYSPARK_DRIVER_PYTHON e PYSPARK_DRIVER_PYTHON_OPTS."
notilas

1
PYSPARK_PYTHON=python3imposta la versione Python dei lavoratori, giusto?
Joe

Se in esecuzione da PyCharm, aggiungi PYSPARK_PYTHON=python3; PYSPARK_DRIVER_PYTHON=ipython3a Esegui> Modifica configurazioni> {your_run_config}> Variabili d'ambiente. Per renderli predefiniti per tutte le configurazioni della corsa, aggiorna le variabili d'ambiente per i modelli desiderati in Esegui> Modifica configurazioni> Modelli
MisterEd

28

Aiutato nel mio caso:

import os

os.environ["SPARK_HOME"] = "/usr/local/Cellar/apache-spark/1.5.1/"
os.environ["PYSPARK_PYTHON"]="/usr/local/bin/python3"

1
questo funziona per me dopo aver impostato PYSPARK_DRIVER_PYTHON sullo stesso valore con PYSPARK_PYTHON.
buxizhizhoum

12

È possibile specificare la versione di Python per il driver impostando le variabili di ambiente appropriate nel ./conf/spark-env.shfile. Se non esiste già, puoi utilizzare il spark-env.sh.templatefile fornito che include anche molte altre variabili.

Ecco un semplice esempio di un spark-env.shfile per impostare le variabili d'ambiente Python rilevanti:

#!/usr/bin/env bash

# This file is sourced when running various Spark programs.
export PYSPARK_PYTHON=/usr/bin/python3       
export PYSPARK_DRIVER_PYTHON=/usr/bin/ipython

In questo caso, imposta la versione di Python usata dai lavoratori / esecutori su Python3 e la versione del driver di Python su iPython per una shell più bella in cui lavorare.

Se non si dispone già di un spark-env.shfile e non è necessario impostare altre variabili, questa dovrebbe fare ciò che si desidera, assumendo che i percorsi ai binari python pertinenti siano corretti (verificare con which). Ho avuto un problema simile e questo lo ha risolto.


Come eseguire questo file?
Volatil3

Ho dovuto rinominare spark-env.sh.template in spark-env.sh e quindi aggiungere alla coda del file export PYSPARK_PYTHON = / usr / local / bin / python3 export PYSPARK_DRIVER_PYTHON = / usr / local / bin / python3. Ho dovuto capire dove fosse il mio python3 tramite quale python3
danivicario

10

Se stai eseguendo Spark in un'organizzazione più grande e non sei in grado di aggiornare il file /spark-env.sh, l'esportazione delle variabili di ambiente potrebbe non funzionare.

È possibile aggiungere le impostazioni Spark specifiche tramite l' --confopzione quando si invia il processo in fase di esecuzione.

pyspark --master yarn --[other settings]\ 
  --conf "spark.pyspark.python=/your/python/loc/bin/python"\ 
  --conf "spark.pyspark.driver.python=/your/python/loc/bin/python"

9

Ho appena affrontato lo stesso problema e questi sono i passaggi che seguo per fornire la versione Python. Volevo eseguire i miei lavori PySpark con Python 2.7 invece di 2.6.

  1. Vai alla cartella a cui $SPARK_HOMEpunta (nel mio caso è /home/cloudera/spark-2.1.0-bin-hadoop2.7/)

  2. Sotto la cartella conf, c'è un file chiamato spark-env.sh. Nel caso in cui si dispone di un file chiamato spark-env.sh.template, sarà necessario copiare il file in un nuovo file chiamato spark-env.sh.

  3. Modifica il file e scrivi le tre righe successive

    esporta PYSPARK_PYTHON = / usr / local / bin / python2.7

    esporta PYSPARK_DRIVER_PYTHON = / usr / local / bin / python2.7

    export SPARK_YARN_USER_ENV = "PYSPARK_PYTHON = / usr / local / bin / python2.7"

  4. Salvalo e avvia nuovamente l'applicazione :)

In questo modo, se scarichi una nuova versione standalone di Spark, puoi impostare la versione di Python su cui desideri eseguire PySpark.


2
Notare che la raccomandazione è di cpinserire il file spark-env.sh.templatecome nuovo, spark-env.shquindi modificare il nuovo file anziché modificare il nome e il contenuto del modello. Il modello dovrebbe rimanere come riferimento.
et_l

@et_l Hai ragione, ho solo apportato una piccola modifica alla risposta tenendo conto del tuo commento, grazie!
selknam

5

Mi sono imbattuto nello stesso messaggio di errore e ho provato tre modi sopra menzionati. Ho elencato i risultati come riferimento complementare ad altri.

  1. Modificare il valore PYTHON_SPARKe PYTHON_DRIVER_SPARKin spark-env.shnon funziona per me.
  2. Modificare il valore all'interno dello script Python utilizzando os.environ["PYSPARK_PYTHON"]="/usr/bin/python3.5" os.environ["PYSPARK_DRIVER_PYTHON"]="/usr/bin/python3.5"non funziona per me.
  3. Cambia il valore in ~/.bashrcfunziona come un fascino ~

il tuo commento è oro puro dopo aver trascorso un'ora.Grazie
cheapcoder

Grazie mille. Ho provato molte soluzioni. Il tuo ha funzionato molto bene.
Muser

3

Lo stavo eseguendo in IPython (come descritto in questo collegamento da Jacek Wasilewski ) e stavo ottenendo questa eccezione; Aggiunto PYSPARK_PYTHONal file del kernel IPython e utilizzato il notebook jupyter per l'esecuzione e ha iniziato a lavorare.

vi  ~/.ipython/kernels/pyspark/kernel.json

{
 "display_name": "pySpark (Spark 1.4.0)",
 "language": "python",
 "argv": [
  "/usr/bin/python2",
  "-m",
  "IPython.kernel",
  "--profile=pyspark",
  "-f",
  "{connection_file}"
 ],

 "env": {
  "SPARK_HOME": "/usr/local/spark-1.6.1-bin-hadoop2.6/",
  "PYTHONPATH": "/usr/local/spark-1.6.1-bin-hadoop2.6/python/:/usr/local/spark-1
.6.1-bin-hadoop2.6/python/lib/py4j-0.8.2.1-src.zip",
  "PYTHONSTARTUP": "/usr/local/spark-1.6.1-bin-hadoop2.6/python/pyspark/shell.py
",
  "PYSPARK_SUBMIT_ARGS": "--master spark://127.0.0.1:7077 pyspark-shell",
  "PYSPARK_DRIVER_PYTHON":"ipython2",
   "PYSPARK_PYTHON": "python2"
 }

2

Ho avuto lo stesso problema su Spark standalone in Windows . La mia versione della correzione è così: avevo le mie variabili di ambiente impostate come muggito

PYSPARK_SUBMIT_ARGS="pyspark-shell"
PYSPARK_DRIVER_PYTHON=jupyter
PYSPARK_DRIVER_PYTHON_OPTS='notebook' pyspark

Con questa impostazione ho eseguito un'azione su pyspark e ho ottenuto la seguente eccezione:

Python in worker has different version 3.6 than that in driver 3.5, PySpark cannot run with different minor versions.
Please check environment variables PYSPARK_PYTHON and PYSPARK_DRIVER_PYTHON are correctly set.

Per verificare con quale versione di Python sta usando il mio spark-worker, premi quanto segue nel prompt di cmd .

python --version
Python 3.6.3

che mi ha mostrato Python 3.6.3 . Quindi chiaramente il mio spark-worker sta usando il sistema python che è v3.6.3.

Ora mentre imposto il mio spark-driver per eseguire jupyter impostando PYSPARK_DRIVER_PYTHON=jupyter, devo controllare la versione di python che jupyter sta usando.

Per fare questo, apri Anaconda Prompt e premi

python --version
Python 3.5.X :: Anaconda, Inc.

Qui ho il jupyter python sta usando la v3.5.x . Puoi controllare questa versione anche in qualsiasi Notebook (Aiuto-> Informazioni).

Ora ho bisogno di aggiornare jupyter python alla versione v3.6.6 . Per farlo, apri il prompt di Anaconda e premi

conda ricerca python

Questo ti darà un elenco delle versioni di Python disponibili in Anaconda. Installa quello desiderato con

conda installa python = 3.6.3

Ora ho entrambe le installazioni Python della stessa versione 3.6.3 Spark non dovrebbe essere conforme e non lo ha fatto quando ho eseguito un'azione su Spark-driver. L'eccezione è andata. Buona codifica ...


1

Nel caso in cui desideri modificare solo la versione di python per l'attività corrente, puoi utilizzare il seguente comando di avvio di pyspark:

    PYSPARK_DRIVER_PYTHON=/home/user1/anaconda2/bin/python PYSPARK_PYTHON=/usr/local/anaconda2/bin/python pyspark --master ..

1

Si prega di guardare lo snippet di seguito:

#setting environment variable for pyspark in linux||ubuntu
#goto --- /usr/local/spark/conf
#create a new file named spark-env.sh copy all content of spark-env.sh.template to it
#then add below lines to it, with path to python

PYSPARK_PYTHON="/usr/bin/python3"
PYSPARK_DRIVER_PYTHON="/usr/bin/python3"
PYSPARK_DRIVER_PYTHON_OPTS="notebook --no-browser"
#i was running python 3.6 ||run - 'which python' in terminal to find the path of python

Si prega di controllare i modelli prima di pubblicare.
Deepesh Rehi

0

Sto usando il seguente ambiente

? python --version; ipython --version; jupyter --version
Python 3.5.2+
5.3.0
5.0.0

e i seguenti alias funzionano bene per me

alias pyspark="PYSPARK_PYTHON=/usr/local/bin/python3 PYSPARK_DRIVER_PYTHON=ipython ~/spark-2.1.1-bin-hadoop2.7/bin/pyspark --packages graphframes:graphframes:0.5.0-spark2.1-s_2.11"    
alias pysparknotebook="PYSPARK_PYTHON=/usr/bin/python3 PYSPARK_DRIVER_PYTHON=jupyter PYSPARK_DRIVER_PYTHON_OPTS='notebook' ~/spark-2.1.1-bin-hadoop2.7/bin/pyspark --packages graphframes:graphframes:0.5.0-spark2.1-s_2.11"

Nel notebook, ho impostato l'ambiente come segue

from pyspark.context import SparkContext
sc = SparkContext.getOrCreate()

0

Errore

"Eccezione: Python in worker ha una versione 2.6 diversa da quella del driver 2.7, PySpark non può essere eseguito con versioni secondarie diverse". 

Correzione (per ambiente Cloudera)

  • Modifica questo file: /opt/cloudera/parcels/cdh5.5.4.p0.9/lib/spark/conf/spark-env.sh

  • Aggiungi queste righe:

    export PYSPARK_PYTHON=/usr/bin/python
    export PYSPARK_DRIVER_PYTHON=python
    

0

Mi sono imbattuto in questo oggi al lavoro. Un amministratore ha ritenuto prudente codificare Python 2.7 come PYSPARK_PYTHONe PYSPARK_DRIVER_PYTHONin $SPARK_HOME/conf/spark-env.sh. Inutile dire che questo ha interrotto tutti i nostri lavori che utilizzano qualsiasi altra versione o ambiente di Python (che è> 90% dei nostri lavori). @PhillipStich sottolinea correttamente che potresti non avere sempre i permessi di scrittura per questo file, come nel nostro caso. Mentre l'impostazione della configurazione nella spark-submitchiamata è un'opzione, un'altra alternativa (quando si esegue in modalità filato / cluster) è impostare la SPARK_CONF_DIRvariabile di ambiente in modo che punti a un altro script di configurazione. Lì puoi impostare il tuo PYSPARK_PYTHON e qualsiasi altra opzione di cui potresti aver bisogno. Un modello può essere trovato nel codice sorgente spark-env.sh su GitHub .


0

Nel mio caso (Ubuntu 18.04), ho eseguito questo codice nel terminale:

sudo vim ~/.bashrc

e quindi modificato SPARK_HOMEcome segue:

export SPARK_HOME=/home/muser/programs/anaconda2019/lib/python3.7/site-packages/pyspark
export PATH=$PATH:$SPARK_HOME/bin:$SPARK_HOME/sbin

In questo modo, mi SPARK_HOMEriferirò al pysparkpacchetto che ho installato insite-package .

Per imparare a utilizzare vim, vai a questo collegamento.


0

Correre:

ls -l /usr/local/bin/python*

La prima riga in questo esempio mostra il collegamento simbolico python3. Per impostarlo come collegamento simbolico Python predefinito eseguire quanto segue:

ln -s -f /usr/local/bin/python3 /usr/local/bin/python

quindi ricarica la shell.


0

Ho avuto lo stesso problema, ho solo dimenticato di attivare il mio ambiente virtuale. Per chiunque là fuori avesse anche un vuoto mentale.


0

Se stai lavorando su Mac, usa i seguenti comandi

export SPARK_HOME=`brew info apache-spark | grep /usr | tail -n 1 | cut -f 1 -d " "`/libexec
export PYTHONPATH=$SPARK_HOME/python:$PYTHONPATH

export HADOOP_HOME=`brew info hadoop | grep /usr | head -n 1 | cut -f 1 -d " "`/libexec
export LD_LIBRARY_PATH=$HADOOP_HOME/lib/native/:$LD_LIBRARY_PATH
export PYSPARK_PYTHON=python3

Se stai utilizzando un altro sistema operativo, controlla il seguente collegamento: https://github.com/GalvanizeDataScience/spark-install

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.