importowanie pyspark w powłoce Pythona

111

To jest kopia czyjegoś pytania na innym forum, na które nigdy nie udzielono odpowiedzi, więc pomyślałem, że zadam je tutaj ponownie, ponieważ mam ten sam problem. (Zobacz http://geekple.com/blogs/feeds/Xgzu7/posts/351703064084736 )

Mam poprawnie zainstalowanego Spark'a na moim komputerze i jestem w stanie uruchamiać programy w Pythonie z modułami pyspark bez błędów podczas używania ./bin/pyspark jako mojego interpretera Pythona.

Jednak gdy próbuję uruchomić zwykłą powłokę Pythona, kiedy próbuję zaimportować moduły pyspark, pojawia się ten błąd:

from pyspark import SparkContext

i mówi

"No module named pyspark".

Jak mogę to naprawić? Czy istnieje zmienna środowiskowa, którą muszę ustawić, aby wskazać Pythonowi nagłówki / biblioteki / itp.? Jeśli moja instalacja iskrowa to / spark /, które ścieżki pysparka muszę dołączyć? A może programy pyspark mogą być uruchamiane tylko z interpretera pyspark?

Glenn Strycker
źródło
Mówią, że zmiana zmiennych środowiskowych „nie jest super efektywna, ponieważ jest bardzo szybko zastępowana przez bin / spark-submit”. Może dowiesz się czegoś z tej wymiany
emmagras

Odpowiedzi:

97

Oto prosta metoda (jeśli nie przejmujesz się tym, jak to działa !!!)

Użyj findspark

  1. Przejdź do powłoki Pythona

    pip install findspark
    
    import findspark
    findspark.init()
  2. zaimportuj niezbędne moduły

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

Suresh2692
źródło
Inne rozwiązania nie działały u mnie. Na razie używam findspark w moim programie. Wydaje się, że jest to przyzwoite obejście problemu.
Analytical Monk
Wolałabym nie potrzebować tego robić… ale hej … ponieważ nic innego nie działa … wezmę to.
javadba
51

Jeśli wypisze taki błąd:

ImportError: Brak modułu o nazwie py4j.java_gateway

Dodaj $ SPARK_HOME / python / build do PYTHONPATH:

export SPARK_HOME=/Users/pzhang/apps/spark-1.1.0-bin-hadoop2.4
export PYTHONPATH=$SPARK_HOME/python:$SPARK_HOME/python/build:$PYTHONPATH
Peng Zhang 1516540
źródło
9
Jak opisano w innej odpowiedzi stackoverflow.com/questions/26533169/ ... musiałem dodać następujący eksport PYTHONPATH = $ SPARK_HOME / python / lib / py4j-0.8.2.1-src.zip: $ PYTHONPATH
meyerson
46

Okazuje się, że bin pyspark ŁADUJE pythona i automatycznie ładuje prawidłowe ścieżki bibliotek. Sprawdź $ SPARK_HOME / bin / pyspark:

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

Dodałem tę linię do mojego pliku .bashrc i moduły są teraz poprawnie znalezione!

Glenn Strycker
źródło
1
Oprócz tego kroku musiałem również dodać: export SPARK_HOME=~/dev/spark-1.1.0idź rysunek. Twoje nazwy folderów mogą się różnić.
emmagras
21

nie uruchamiaj swojego pliku py jako: python filename.py zamiast tego użyj:spark-submit filename.py

dront
źródło
Czy ktoś może rozwinąć, dlaczego tego nie zrobić? Przyglądałem się temu pytaniu, ale jak dotąd nie udało mi się znaleźć żadnego, które wyjaśniałoby, dlaczego tak jest.
Mint
@Mint Pozostałe odpowiedzi pokazują, dlaczego; pakiet pyspark nie jest domyślnie zawarty w $ PYTHONPATH, więc import pysparknie powiedzie się w linii poleceń lub w wykonywanym skrypcie. Musisz albo. uruchomić pyspark przez spark-submit zgodnie z przeznaczeniem lub b. dodaj $ SPARK_HOME / python do $ PYTHONPATH.
kingledion
Kolejnym punktem jest spark-submit to skrypt powłoki, który pomaga poprawnie skonfigurować środowisko systemowe przed użyciem sparka, jeśli robisz tylko python main.py musisz poprawnie skonfigurować środowisko systemowe np. PYTHONPATH, SPARK_HOME
E.ZY.
21

Po wyeksportowaniu ścieżki SPARK i ścieżki Py4j zaczęło działać:

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

Jeśli więc nie chcesz ich wpisywać za każdym razem, gdy chcesz uruchomić powłokę Pythona, możesz dodać ją do swojego .bashrcpliku

Dawny33
źródło
1
Nie mogę znaleźć katalogu libexec w mojej Apache Sparkinstalacji, masz jakiś pomysł?
Alberto Bonsanto
@AlbertoBonsanto Przepraszamy. Nie spotkałem się z tym problemem. Więc nie mam pojęcia :(
Dawny33,
1
Tak, wyjęli folder libexec w Spark 1.5.2
bluerubez
1
@bluerubez Wydaje się, że jest tam w Spark 1.6.2 ... Poza tym nie jestem pewien, do czego libexec/python/buildsłuży katalog, ale Spark 1.6.2 tego nie ma
OneCricketeer
17

Na Macu używam Homebrew do zainstalowania Sparka (formuła „apache-spark”). Następnie ustawiam PYTHONPATH w ten sposób, aby import Pythona działał:

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

Zastąp wersję „1.2.0” aktualną wersją Apache-Spark na komputerze Mac.

jyu
źródło
14

Do wykonania Sparka w pyspark wymagane są dwa komponenty do współpracy:

  • pyspark pakiet python
  • Wystąpienie Spark w JVM

Podczas uruchamiania rzeczy za pomocą spark-submit lub pyspark, te skrypty zajmą się obydwoma, tj. Skonfigurują PYTHONPATH, PATH itp., Aby twój skrypt mógł znaleźć pyspark, a także uruchomią instancję spark, konfigurując zgodnie z twoimi parametrami , np. --master X

Alternatywnie można ominąć te skrypty i uruchomić aplikację Spark bezpośrednio w interpreterze języka Python, takim jak python myscript.py. Jest to szczególnie interesujące, gdy skrypty iskier stają się bardziej złożone i ostatecznie otrzymują własne argumenty.

  1. Upewnij się, że pakiet pyspark można znaleźć przez interpreter języka Python. Jak już wspomniano, dodaj katalog spark / python do PYTHONPATH lub zainstaluj pyspark bezpośrednio za pomocą pip install.
  2. Ustaw parametry instancji Spark ze swojego skryptu (te, które były przekazywane do pyspark).
    • W przypadku konfiguracji Spark, jak zwykle ustawia się za pomocą --conf, są one zdefiniowane za pomocą obiektu konfiguracyjnego (lub konfiguracji ciągu) w SparkSession.builder.config
    • W przypadku głównych opcji (takich jak --master lub --driver-mem) w tej chwili możesz je ustawić, pisząc do zmiennej środowiskowej PYSPARK_SUBMIT_ARGS. Aby uczynić wszystko czystszym i bezpieczniejszym, możesz ustawić go z poziomu samego Pythona, a Spark odczyta go podczas uruchamiania.
  3. Uruchom instancję, która wymaga tylko wywołania getOrCreate()z obiektu budującego.

Twój skrypt może zatem mieć coś takiego:

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())
F Pereira
źródło
9

Aby się go pozbyć ImportError: No module named py4j.java_gateway, musisz dodać następujące wiersze:

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)
Karang
źródło
7

W systemie Windows 10 działały u mnie następujące rozwiązania. Dodałem następujące zmienne środowiskowe za pomocą opcji Ustawienia > Edytuj zmienne środowiskowe dla Twojego konta :

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

(zmień „C: \ Programming \ ...” na folder, w którym zainstalowałeś Spark)

JustAC0der
źródło
5

Dla użytkowników Linuksa prawidłowy (i nie zakodowany na stałe) sposób włączenia pyspark libaray do PYTHONPATH. Potrzebne są obie części PATH:

  1. Ścieżka do samego modułu pyspark Python i
  2. Ścieżka do spakowanej biblioteki, na której opiera się ten moduł pyspark podczas importowania

Zauważ poniżej, że wersja spakowanej biblioteki jest określana dynamicznie, więc nie kodujemy jej na stałe.

export PYTHONPATH=${SPARK_HOME}/python/:$(echo ${SPARK_HOME}/python/lib/py4j-*-src.zip):${PYTHONPATH}
NYCeyes
źródło
4

Używam klastra Spark na CentOS VM, który jest instalowany z pakietów cloudera yum.

Musiał ustawić następujące zmienne, aby uruchomić pyspark.

export SPARK_HOME=/usr/lib/spark;
export PYTHONPATH=$SPARK_HOME/python:$SPARK_HOME/python/lib/py4j-0.9-src.zip:$PYTHONPATH
sujesh chirackkal
źródło
4
export PYSPARK_PYTHON=/home/user/anaconda3/bin/python
export PYSPARK_DRIVER_PYTHON=jupyter
export PYSPARK_DRIVER_PYTHON_OPTS='notebook'

Oto, co zrobiłem, używając mojej dystrybucji Anaconda ze Sparkiem. To jest niezależna od wersji Spark. Możesz zmienić pierwszą linię do bin pythona użytkowników. Ponadto od Spark 2.2.0 PySpark jest dostępny jako samodzielny pakiet na PyPi, ale jeszcze go nie przetestowałem.

Yayati Sule
źródło
4

Możesz pobrać pyspark pathw Pythonie używając pip(jeśli zainstalowałeś pyspark używając PIP) jak poniżej

pip show pyspark
user3524049
źródło
3

Miałem ten sam problem.

Upewnij się również, że używasz odpowiedniej wersji Pythona i instalujesz ją z odpowiednią wersją pip. w moim przypadku: miałem zarówno Pythona 2.7, jak i 3.x. Zainstalowałem pyspark z

pip2.7 zainstaluj pyspark

i zadziałało.

etinika
źródło
2

Otrzymałem ten błąd, ponieważ skrypt Pythona, który próbowałem przesłać, miał nazwę pyspark.py ( facepalm ). Poprawka polegała na ustawieniu mojej PYTHONPATH zgodnie z powyższymi zaleceniami, a następnie zmianie nazwy skryptu na pyspark_test.py i wyczyszczeniu pliku pyspark.pyc, który został utworzony w oparciu o oryginalną nazwę mojego skryptu, co usunęło ten błąd.

Patrick
źródło
2

W przypadku DSE (DataStax Cassandra & Spark) Do PYTHONPATH należy dodać następującą lokalizację

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

Następnie użyj dse pyspark, aby uzyskać moduły na ścieżce.

dse pyspark
Sreesankar
źródło
2

Miałem ten sam problem i dodałbym jedną rzecz do zaproponowanych powyżej rozwiązań. Używając Homebrew na Mac OS X do zainstalowania Sparka, będziesz musiał poprawić adres ścieżki py4j, aby uwzględnić libexec w ścieżce (pamiętaj o zmianie wersji py4j na tę, którą posiadasz);

PYTHONPATH=$SPARK_HOME/libexec/python/lib/py4j-0.9-src.zip:$PYTHONPATH
tjb305
źródło
Uwaga - próbowałem go rozpakować i użyć py4jtylko folderu, ale nie zadziałało. Użyj pliku zip ...
El Dude
2

W moim przypadku była to instalacja w innym pythonie dist_package (python 3.5), podczas gdy ja używałem pythona 3.6, więc poniższe pomogły:

python -m pip install pyspark
D Nietykalny
źródło
1

Możesz także utworzyć kontener Docker z Alpine jako systemem operacyjnym i zainstalować Python i Pyspark jako pakiety. Dzięki temu wszystko będzie w kontenerze.

Wir
źródło