Jak ustawić wersję sterownika w języku Python w Spark?

88

Używam Spark 1.4.0-rc2, więc mogę używać Pythona 3 z Spark. Jeśli dodam export PYSPARK_PYTHON=python3do mojego pliku .bashrc, mogę uruchomić Spark interaktywnie z Pythonem 3. Jednak jeśli chcę uruchomić samodzielny program w trybie lokalnym, pojawia się błąd:

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

Jak mogę określić wersję Pythona dla sterownika? Ustawienie export PYSPARK_DRIVER_PYTHON=python3nie działało.

Kevin
źródło

Odpowiedzi:

34

Musisz upewnić się, że samodzielny projekt, który uruchamiasz, jest uruchamiany w Pythonie 3. Jeśli przesyłasz swój samodzielny program przez spark-submit, to powinno działać dobrze, ale jeśli uruchamiasz go w Pythonie, upewnij się, że używasz python3 do rozpoczęcia Twoja aplikacja.

Upewnij się również, że ustawiłeś zmienne env w ./conf/spark-env.sh(jeśli nie istnieje, możesz użyć ich spark-env.sh.templatejako podstawy).

Holden
źródło
3
@Kevin - Mam ten sam problem, czy mógłbyś opublikować swoje rozwiązanie dotyczące zmian wprowadzonych w spark-evn.sh.
Dev Patel
1
Jest to właściwy sposób wywoływania zmiennych PATH w Sparku, zamiast modyfikowania .bashrc.
CᴴᴀZ
Dlaczego używanie Pythona 3 jest wymagane @Holden?
jerzy
Spark może działać w python2, ale w tym przypadku użytkownik próbował określić python3 w swoim pytaniu. Niezależnie od wersji Pythona, należy to robić konsekwentnie.
Holden
83

U mnie działa zarówno ustawienie, jak PYSPARK_PYTHON=python3i PYSPARK_DRIVER_PYTHON=python3python3. Zrobiłem to używając eksportu w moim .bashrc. W końcu są to zmienne, które tworzę:

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"

Postępowałem również zgodnie z tym samouczkiem, aby działał z poziomu notebooka Ipython3: http://ramhiser.com/2015/02/01/configuring-ipython-notebook-support-for-pyspark/

fccoelho
źródło
5
Wystąpił błąd w Spark 2.1 związany z opcją „IPYTHON = 1”. Komunikat o błędzie to „IPYTHON i IPYTHON_OPTS są usuwane w Spark 2.0+. Usuń je ze środowiska i zamiast tego ustaw PYSPARK_DRIVER_PYTHON i PYSPARK_DRIVER_PYTHON_OPTS”.
notilas
1
PYSPARK_PYTHON=python3ustawia wersję pracowników w Pythonie, prawda?
Joe
Jeśli uruchamiasz z PyCharm, dodaj PYSPARK_PYTHON=python3; PYSPARK_DRIVER_PYTHON=ipython3do Run> Edit Configurations> {your_run_config}> Environment Variables. Aby ustawić je jako domyślne dla wszystkich konfiguracji uruchamiania, zaktualizuj zmienne środowiskowe dla żądanych szablonów w obszarze Uruchom> Edytuj konfiguracje> Szablony
MisterEd
28

Pomogło w moim przypadku:

import os

os.environ["SPARK_HOME"] = "/usr/local/Cellar/apache-spark/1.5.1/"
os.environ["PYSPARK_PYTHON"]="/usr/local/bin/python3"
Nikolay Bystritskiy
źródło
1
to działa dla mnie po ustawieniu PYSPARK_DRIVER_PYTHON na tę samą wartość z PYSPARK_PYTHON.
buxizhizhoum
12

Możesz określić wersję Pythona dla sterownika, ustawiając odpowiednie zmienne środowiskowe w ./conf/spark-env.shpliku. Jeśli jeszcze nie istnieje, możesz użyć spark-env.sh.templatedostarczonego pliku, który zawiera również wiele innych zmiennych.

Oto prosty przykład spark-env.shpliku do ustawiania odpowiednich zmiennych środowiskowych Pythona:

#!/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

W tym przypadku ustawia wersję Pythona używaną przez pracowników / wykonawców na Python3, a wersję sterownika Pythona na iPython, aby ładniejsza powłoka działała.

Jeśli nie masz jeszcze spark-env.shpliku i nie musisz ustawiać żadnych innych zmiennych, ten powinien zrobić, co chcesz, zakładając, że ścieżki do odpowiednich plików binarnych Pythona są poprawne (sprawdź za pomocą which). Miałem podobny problem i to go naprawiło.

James Clarke
źródło
Jak uruchomić ten plik?
Volatil3
Musiałem zmienić nazwę spark-env.sh.template na spark-env.sh, a następnie dodać do końca eksportu pliku PYSPARK_PYTHON = / usr / local / bin / python3 export PYSPARK_DRIVER_PYTHON = / usr / local / bin / python3. Musiałem dowiedzieć się, gdzie był mój python3, przez który python3
danivicario
10

Jeśli używasz Spark w większej organizacji i nie możesz zaktualizować pliku /spark-env.sh, eksportowanie zmiennych środowiskowych może nie działać.

Możesz dodać określone ustawienia Spark za pomocą --confopcji podczas przesyłania zadania w czasie wykonywania.

pyspark --master yarn --[other settings]\ 
  --conf "spark.pyspark.python=/your/python/loc/bin/python"\ 
  --conf "spark.pyspark.driver.python=/your/python/loc/bin/python"
Phillip Stich
źródło
9

Właśnie spotkałem się z tym samym problemem i oto kroki, które wykonuję, aby udostępnić wersję Python. Chciałem uruchamiać moje zadania PySpark w Pythonie 2.7 zamiast 2.6.

  1. Przejdź do folderu, na który $SPARK_HOMEwskazuje (w moim przypadku jest /home/cloudera/spark-2.1.0-bin-hadoop2.7/)

  2. W folderze confznajduje się plik o nazwie spark-env.sh. Jeśli masz plik o nazwie spark-env.sh.template, musisz skopiować go do nowego pliku o nazwie spark-env.sh.

  3. Edytuj plik i napisz kolejne trzy wiersze

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

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

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

  4. Zapisz go i ponownie uruchom aplikację :)

W ten sposób, jeśli pobierzesz nową samodzielną wersję Spark'a, możesz ustawić wersję Pythona, dla której chcesz uruchomić PySpark.

selknam
źródło
2
Zwróć uwagę, że zalecenie dotyczy cppliku spark-env.sh.templatejako nowego, spark-env.sha następnie zmień nowy plik zamiast zmieniać nazwę i zawartość szablonu. Szablon ma pozostać punktem odniesienia.
et_l
@et_l Masz rację, właśnie dokonałem niewielkiej modyfikacji odpowiedzi, biorąc pod uwagę Twój komentarz, dzięki!
selknam
5

Natknąłem się na ten sam komunikat o błędzie i wypróbowałem trzy sposoby wymienione powyżej. Podałem wyniki jako odniesienie uzupełniające do innych.

  1. Zmiana wartości PYTHON_SPARKi PYTHON_DRIVER_SPARKw spark-env.shnie działa dla mnie.
  2. Zmiana wartości w skrypcie Pythona za pomocą os.environ["PYSPARK_PYTHON"]="/usr/bin/python3.5" os.environ["PYSPARK_DRIVER_PYTHON"]="/usr/bin/python3.5"nie działa dla mnie.
  3. Zmień wartość w ~/.bashrcdziała jak urok ~
Szczery
źródło
Twój komentarz to czyste złoto po spędzeniu godziny. dzięki
cheapcoder
Dziękuję Ci bardzo. Przetestowałem wiele rozwiązań. Twój działał bardzo ładnie.
Muser
3

Uruchomiłem go w IPythonie (jak opisał w tym linku Jacek Wasilewski ) i otrzymywałem ten wyjątek; Dodano PYSPARK_PYTHONdo pliku jądra IPython i użyłem notatnika jupyter do uruchomienia i zacząłem działać.

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"
 }
Alex Punnen
źródło
2

Mam ten sam problem na autonomicznej iskrze w systemie Windows . Moja wersja poprawki wygląda następująco: moje zmienne środowiskowe zostały ustawione jak poniżej

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

Z tym ustawieniem wykonałem akcję na pyspark i otrzymałem następujący wyjątek:

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.

Aby sprawdzić, z której wersji języka Python korzysta mój program Spark- Worker, w wierszu polecenia cmd naciśnij następujący przycisk .

python --version
Python 3.6.3

co pokazało mi Python 3.6.3 . Więc wyraźnie mój iskrownik używa systemu Python w wersji 3.6.3.

Teraz, gdy ustawiłem mój sterownik iskier, aby uruchamiał jupyter przez ustawieniePYSPARK_DRIVER_PYTHON=jupyter więc muszę sprawdzić, której wersji Pythona używa jupyter.

Aby to zrobić, otwórz Anaconda Prompt i naciśnij

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

Tutaj mam jupyter Python używa wersji 3.5.x. . Możesz sprawdzić tę wersję również w dowolnym Notatniku (Pomoc-> Informacje).

Teraz muszę zaktualizować jupyter Python do wersji v3.6.6 . Aby to zrobić, otwórz Anaconda Prompt i naciśnij

wyszukiwarka Conda Python

Spowoduje to wyświetlenie listy dostępnych wersji Pythona w programie Anaconda. Zainstaluj żądany za pomocą

conda install python = 3.6.3

Teraz mam obie instalacje Pythona w tej samej wersji 3.6.3 Spark nie powinien być zgodny i nie był, gdy uruchomiłem Action na sterowniku Spark. Wyjątek minął. Miłego kodowania ...

Rizvi Hasan
źródło
1

Jeśli chcesz zmienić tylko wersję Pythona dla bieżącego zadania, możesz użyć następującego polecenia pyspark start:

    PYSPARK_DRIVER_PYTHON=/home/user1/anaconda2/bin/python PYSPARK_PYTHON=/usr/local/anaconda2/bin/python pyspark --master ..
Piotruś Pan
źródło
1

Spójrz na poniższy fragment:

#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
Justin Varughese
źródło
Przed wysłaniem sprawdź szablony.
Deepesh Rehi
0

Używam następującego środowiska

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

a poniższe aliasy dobrze mi odpowiadają

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"

W notebooku skonfigurowałem środowisko w następujący sposób

from pyspark.context import SparkContext
sc = SparkContext.getOrCreate()
George Fisher
źródło
0

Błąd

„Wyjątek: Python w pliku roboczym ma inną wersję 2.6 niż sterownik 2.7, PySpark nie może działać z różnymi wersjami pomocniczymi”. 

Poprawka (dla środowiska Cloudera)

  • Edytuj ten plik: /opt/cloudera/parcels/cdh5.5.4.p0.9/lib/spark/conf/spark-env.sh

  • Dodaj te linie:

    export PYSPARK_PYTHON=/usr/bin/python
    export PYSPARK_DRIVER_PYTHON=python
    
Williama Lee
źródło
0

Wpadłem na to dzisiaj w pracy. Administrator uznał za rozsądne zakodowanie Pythona 2.7 na stałe jako PYSPARK_PYTHONi PYSPARK_DRIVER_PYTHONw $SPARK_HOME/conf/spark-env.sh. Nie trzeba dodawać, że zepsuło to wszystkie nasze zadania, które wykorzystują inne wersje lub środowiska Pythona (co stanowi> 90% naszych zadań). @PhillipStich słusznie wskazuje, że nie zawsze możesz mieć uprawnienia do zapisu do tego pliku, jak to ma miejsce w naszym przypadku. Podczas gdy ustawienie konfiguracji w spark-submitwywołaniu jest opcją, inną alternatywą (podczas pracy w trybie przędzy / klastra) jest ustawienie SPARK_CONF_DIRzmiennej środowiskowej tak, aby wskazywała na inny skrypt konfiguracyjny. Tam możesz ustawić swój PYSPARK_PYTHON i inne opcje, których możesz potrzebować. Szablon można znaleźć w kodzie źródłowym spark-env.sh na github .

Grr
źródło
0

W moim przypadku (Ubuntu 18.04) uruchomiłem ten kod w terminalu:

sudo vim ~/.bashrc

a następnie zredagowano SPARK_HOMEw następujący sposób:

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

Robiąc to, moja SPARK_HOMEwola odnosi się do pysparkpakietu, który zainstalowałem wsite-package .

Aby dowiedzieć się, jak korzystać vim, przejdź do tego linku.

Muser
źródło
0

Biegać:

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

Pierwszy wiersz w tym przykładzie pokazuje link symboliczny python3. Aby ustawić go jako domyślne łącze symboliczne Pythona, uruchom następujące polecenie:

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

następnie przeładuj powłokę.

Hillary Murefu
źródło
0

Miałem ten sam problem, po prostu zapomniałem aktywować swoje wirtualne środowisko. Dla każdego, kto również miał mentalną pustkę.

chadmc
źródło
0

Jeśli pracujesz na komputerze Mac, użyj następujących poleceń

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

Jeśli używasz innego systemu operacyjnego, sprawdź poniższe łącze: https://github.com/GalvanizeDataScience/spark-install

Juan jose
źródło